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

2022-07-13 20:27:13 字數 1764 閱讀 4326

題目描述

李哲非常非常喜歡檸檬樹,特別是在靜靜的夜晚,當天空中有一彎明月溫柔 地照亮地面上的景物時,他必會悠閒地坐在他親手植下的那棵檸檬樹旁,獨自思 索著人生的哲理。

李哲是乙個喜愛思考的孩子,當他看到在月光的照射下檸檬樹投在地面上的 影子是如此的清晰,馬上想到了乙個問題:樹影的面積是多大呢?

李哲知道,直接測量面積是很難的,他想用幾何的方法算,因為他對這棵檸 檬樹的形狀了解得非常清楚,而且想好了簡化的方法。

李哲將整棵檸檬樹分成了 n 層,由下向上依次將層編號為 1,2,…,n。從第 1 到 n-1 層,每層都是乙個圓台型,第 n 層(最上面一層)是圓錐型。對於圓台型, 其上下底面都是水平的圓。對於相鄰的兩個圓台,上層的下底面和下層的上底面 重合。第 n 層(最上面一層)圓錐的底面就是第 n-1 層圓台的上底面。所有的底面 的圓心(包括樹頂)處在同一條與地面垂直的直線上。李哲知道每一層的高度為 h1,h2,…,hn,第 1 層圓台的下底面距地面的高度為 h0,以及每層的下底面的圓的 半徑 r1,r2,…,rn。李哲用熟知的方法測出了月亮的光線與地面的夾角為 alpha。

題解

腦補一下這個影子長什麼樣子(反正我腦補不出來),是一堆圓和相鄰兩個圓之間構成的梯形構成,我們要求的就是這一大坨東西的面積。

只需要保留兩位小數,我們可以用自適應辛普森積分來求。

然後注意高度要乘上三角函式,但半徑不用,因為平面在豎直方向的投影長度為零。

然後就是用計算幾何亂搞(好噁心)

。細節還是挺多的,可能是我太菜了,斜邊和直角邊都搞錯了。

**

#include#include

#include

#define n 602

using

namespace

std;

const

double eps=1e-7

;int

n;double

alpha,h[n],r[n];

struct yuanc[n];

struct xianduanl[n];

inline xianduan _work(yuan a,yuan b);

if(fabs(a.r-b.r)return x=;

double r1=fabs(a.r-b.r),x1=b.x-a.x,zh=sqrt(x1*x1-r1*r1),co=zh/x1,si=r1/x1,x2=a.r/co,x3=b.r/co;

x.k=(x3-x2)/x1;x.b=x2-a.x*x.k;

if(a.r>b.r)x.l=a.x+a.r*si,x.r=b.x+b.r*si;else x.l=a.x-a.r*si,x.r=b.x-b.r*si;

returnx;}

inline

double f(double

x) inline

double simpson(double l,double

r)double solve(double l,double r,double

num)

intmain()

for(int i=1;i1

]);

double l=2e9,r=-2e9;

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

printf(

"%.2lf

",solve(l,r,simpson(l,r))*2

);

return0;

}

NOI2005 月下檸檬樹

一堆圓台平行光的投影 在草稿紙上畫一下,發現對於乙個圓,它投影完還是乙個半徑不變的圓。定義樹的軸在投影平面上經過的點為原點,定乙個正方向,建立平面直角座標系,能發現,對於乙個半徑為 r 高度為 h 的圓,投影到平面上是圓心座標為 cot alpha h,0 半徑為 r 的圓 想象有乙個水平的平面,豎...

NOI2005 月下檸檬樹

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

bzoj 1502 NOI2005 月下檸檬樹

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