HDU1632 半平面交

2022-04-21 11:28:23 字數 1993 閱讀 9391

模板題

題意:給定兩個凸多邊形,求出合併後的面積,這個合併後的面積不包括重疊部分。

1 #include2 #include

3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn = 155;8

const

int maxm = 155;9

const

double eps = 1e-8;10

const

double pi = acos(-1.0

);11

struct

point;

14struct

line;

17point pnt1[ maxn ],res[ maxm ],pnt2[ maxn ],tp[ maxm ];

18double

xmult( point op,point sp,point ep )

21double

dist( point a,point b )

24void get_equation( point p1,point p2,double &a,double &b,double &c )//

直線方程

29 point intersection( point p1,point p2,double a,double b,double

c )//

交點、按照三角比例求出交點

37double getarea( point p,int

n )42

return -sum/2.0

;43 }//

面積,順時針為正

44void cut( double a,double b,double c,int &cnt )

50else

54if( a*res[i+1].x+b*res[i+1].y+c>eps )57}

58}59for( int i=1;i<=temp;i++)

60 res[i] =tp[i];

61 res[ 0 ] =res[ temp ];

62 res[ temp+1 ] = res[ 1

];63 cnt =temp;64}

6566

intmain()

72 scanf("

%d",&m);

73for( int i=1;i<=m;i++)

76double

sumarea1,sumarea2,area;

77 sumarea1 =getarea( pnt1,n );

78 sumarea2 =getarea( pnt2,m );

79if( sumarea1

82 pnt1[ 0 ] =pnt1[ n ];

83 pnt1[ n+1 ] = pnt1[ 1

];84

if( sumarea2

87 pnt2[ 0 ] =pnt2[ m ];

88 pnt2[ m+1 ] = pnt2[ 1

];89

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

92int cnt =n;

93for( int i=1;i<=m;i++)

98 area =getarea( res,cnt );

99double ans = fabs(sumarea1)+fabs(sumarea2)-2.0*fabs(area);

100 printf("

%8.2lf

",ans);

101}

102 puts(""

);103

return0;

104 }

view code

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...

模板 半平面交

考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...

半平面交 板子

poj 2451 敲了個板子,比帶花樹稍微好一些,但是還是很麻煩.寫了點注釋 include include include define point vector const int n 2e4 10 struct vector vector double x,double y double an...