HDU 3982 半平面交 圓和凸多邊形面積並

2022-05-24 03:18:08 字數 3989 閱讀 7542

從這裡看到的這個題。。很容易想到正解。

思路大概一樣,就是不知道為什麼我被卡精度了,,,

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 行每行兩個整數,逆時針給出各個頂點的...