從這裡看到的這個題。。很容易想到正解。
思路大概一樣,就是不知道為什麼我被卡精度了,,,
acos精度本來就不好,然後題目還要求輸出百分比+五位小數,直接把精度卡了。
反正我寫出來的當半徑很大的時候誤差會非常大,會達到3%左右。哎,查了乙個下午,用幾何畫板模擬。真是噁心死了!
我早知道卡精度就不做了。
不知道「小媛」姐姐是怎麼做的,實在不想看這個題了。
感覺我的思維和**都是挺清晰的。。
儘管wa了,還是貼出來吧。。
view code
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7(至今寫的最長的計算幾何題了。。。)8#define n 222222
9#define side 11111
10#define eps 1e-6
11#define bug system("pause")
1213
const
double pi=acos(-1.0
);14
15using
namespace
std;
1617
struct
po18
22}p[n],o,my,dp[n];
2324
struct
li25
29void prt()
30}li[n],deq[n],qs;
3132
double
r,ah;
33int
n,cnt,tn,m;
3435 inline int dc(double
x)36
4142 inline po operator -(po a,po b)
4347
48 inline po operator +(po a,po b)
4953
54 inline po operator *(po a,double
k)55
5960 inline po operator /(po a,double
k)61
6566 inline double
cross(po a,po b,po c)
6770
71 inline double
dot(po a,po b,po c)
7275
76 inline double getlen(const li &a)
7780
81 inline double getlen(const po &a)
8285
86 inline double getdis(const po &a,const po &b)
8790
91 inline double getdisl(const po &a,const li &b)
9296
97 inline void
read()
98108 scanf("
%lf%lf
",&my.x,&my.y);
109}
110111 inline void getdir()//
規範每條線的方向
112116
117 inline void getangle()//
計算所有直線的極角
118128
129 inline bool cmp(const li &a,const li &b)//
極角排序,內側在前
130134
135 inline po getpoint(const li &a,const li &b)//
直線交點
136142
143 inline void getcut()//
半平面交
144158
while(bot1])))<0) top--;
159while(bot1])))<0) bot++;
160if(bot==top) return
;161 cnt=0
;162
for(int i=bot;i1
]);163
if(top-1>bot) p[++cnt]=getpoint(deq[bot],deq[top]);
164}
165166 inline double getg(const po &s,const po &t)//
弓形面積
167 //
三角形
172else res=-fabs(cross(o,s,t)/2
);173
double la=r*cc; //
弧長 174
double ss=r*la/2;//
扇形面積
175return res+ss;
176}
177178 inline po getf(const po &a,const po &b)//
ab的右旋法向量
179184
185 inline po rotate(const po &a,double sss,double
ccc)
186192
193 inline void getcpoint(const li &a,po &s,po &t)//
直線與圓的交點
194205
206 inline bool onseg(const po &a,const li &b)//
207212
213 inline bool cmp1(const po &a,const po &b)
214217
218 inline bool cmp2(const po &a,const po &b)//
unique的去重函式
219223
224 inline void
cir()
225236
else
if(dis==0)//
在圓上的頂點
237241
}242 p[cnt+1]=p[1
];243
po s,t;li pl;
244for(int i=1;i<=cnt;i++)//
凸多邊形和圓的交點
245255
if(onseg(t,pl))
256260
}261
}262
for(int i=1;i<=n;i++) dp[i].ag=atan2(dp[i].y-my.y,dp[i].x-my.x);
263 sort(dp+1,dp+1+n,cmp1);
264 n=unique(dp+1,dp+1+n,cmp2)-dp-1
;265 dp[n+1]=dp[1
];266 ah=0
;267
for(int i=1;i<=n;i++)
268if(dp[i].fg&&dp[i+1].fg) ah+=getg(dp[i],dp[i+1
]);269
}270
271 inline double
getarea()
272278
279 inline void
go()
280286
getdir();
287getangle();
288getcut();
289cir();
290double area=fabs(getarea());
291 printf("
%.5lf%%\n
",(area+ah)/(pi*r*r)*100
);292
293}
294295
intmain()
296303
return0;
304 }
bzoj2618 凸多邊形 半平面交
bzoj上300題辣!啦啦啦上圖紀念!本來bzoj2618打算第299個做的,然後日常翻題解的時候發現popoqqq居然是第300題做的bzoj2618!為了和大爺同步我就先水另外一題,然後也在第300題a可bzoj2618!和大爺的300題一樣是不是有什麼含義 難道是乙個flag?多個凸多邊形求交...
CQOI2006 凸多邊形 暴力半平面交
半平面交總覺得和線性規劃莫名的像?逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。輸入格式 第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi,表示多邊形的邊數,以下mi行每行兩個整數...
演算法複習 半平面交(bzoj2618凸多邊形)
這裡套用wuvin 逆時針給出n個凸多邊形的頂點座標,求它們交的面積。例如n 2時,兩個凸多邊形如下圖 則相交部分的面積為5.233。第一行有乙個整數n,表示凸多邊形的個數,以下依次描述各個多邊形。第i個多邊形的第一行包含乙個整數mi 表示多邊形的邊數,以下mi 行每行兩個整數,逆時針給出各個頂點的...