一堆圓台平行光的投影
在草稿紙上畫一下,發現對於乙個圓,它投影完還是乙個半徑不變的圓。
定義樹的軸在投影平面上經過的點為原點,定乙個正方向,建立平面直角座標系,
能發現,對於乙個半徑為\(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,表示檸檬樹每層下底面的圓的半徑。上述輸入檔案中的資料,同一行相鄰的兩個數之間用乙個空格分...