NOI2005 月下檸檬樹

2022-05-05 12:21:09 字數 1381 閱讀 6661

一堆圓台平行光的投影

在草稿紙上畫一下,發現對於乙個圓,它投影完還是乙個半徑不變的圓。

定義樹的軸在投影平面上經過的點為原點,定乙個正方向,建立平面直角座標系,

能發現,對於乙個半徑為\(r\),高度為\(h\)的圓,投影到平面上是圓心座標為\((cot(\alpha)h, 0)\),半徑為\(r\)的圓

想象有乙個水平的平面,豎直向上移,可以把樹切出一堆圓,對於這些圓,把它們投影求個並就是答案

對於每個圓台,它一堆圓的並就是先求上下兩個面的圓的投影,再對投影求外公切線,圍成的圖形

如圖,就是\(behdgf\)圍成的面積

注意對於兩個圓的內含或內切關係,是沒有切線的

對於樹頂,我們把它當做乙個半徑為\(0\)的圓

那麼大概可以畫成這樣

首先因為它是軸對稱的,所以只用算出x軸上方的

但是這面積並怎麼求呢?求出所有交點?

這個圖挺特殊,所以可以對不規則的函式下方面積考慮使用自適應simpson

然後就做完了

#include #include #include #include #include const double eps = 1e-6;

const double stop = 15;

const int maxn = 510;

double xs[maxn], rs[maxn], theta;

double tx1[maxn], ty1[maxn], tx2[maxn], ty2[maxn];

int bak;

inline double absx(double x)

inline double sqrx(double x)

int n;

double f(double at)

for (int i = 1; i <= bak; ++i)

} return res;

}inline double calc(double l, double mid, double r)

double simpson(double l, double r, double eps, double ll, double midv, double lr)

int main()

for (int i = 1; i != n; ++i) scanf("%lf", rs + i);

for (int i = 1; i <= n; ++i)

rs[n] = 0;

for (int i = 1; i != n; ++i)

printf("%.2lf\n", simpson(l, r, eps, f(l), f((l + r) / 2), f(r)) * 2);

return 0;

}

NOI2005 月下檸檬樹

題意 給定一棵由若干個圓台和圓錐組成的樹,求這棵樹在與地面成 alpha 角的平行光束照射下產生的投影的面積。題解 顯然投影下去之後每個圓的 r 不變,而高度 h 變成 frac 圓的面積可以直接算,兩個圓的公切線形成的梯形用三角函式推一下也可以直接算。那麼直接 simpson 積分算一下就行了。注...

NOI2005 月下檸檬樹 計算幾何 積分

題目描述 李哲非常非常喜歡檸檬樹,特別是在靜靜的夜晚,當天空中有一彎明月溫柔 地照亮地面上的景物時,他必會悠閒地坐在他親手植下的那棵檸檬樹旁,獨自思 索著人生的哲理。李哲是乙個喜愛思考的孩子,當他看到在月光的照射下檸檬樹投在地面上的 影子是如此的清晰,馬上想到了乙個問題 樹影的面積是多大呢?李哲知道...

bzoj 1502 NOI2005 月下檸檬樹

檔案的第1行包含乙個整數n和乙個實數alpha,表示檸檬樹的層數和月亮的光線與地面夾角 單位為弧度 第2行包含n 1個實數h0,h1,h2,hn,表示樹離地的高度和每層的高度。第3行包含n個實數r1,r2,rn,表示檸檬樹每層下底面的圓的半徑。上述輸入檔案中的資料,同一行相鄰的兩個數之間用乙個空格分...