計算幾何模板整理

2022-07-17 02:00:12 字數 2709 閱讀 1704

整理計算幾何模板,以及一些題目

update 1:基礎函式,點,向量的運算

update 2:凸包,旋轉卡殼

基礎的函式定義

1

const

double eps = 1e-8;2

int dcmp(double

x)

dcmp

基於點和向量的運算

1

struct

point

4 point():x(0.0),y(0.0

){}5};6

typedef point vec;78

void

showpoint(point a)

11const vec operator +(vec a, vec b)

14const vec operator -(vec a, vec b)

17const

double

operator *(vec a, vec b)

20//

a*b = |a|*|b|*sin(theta)

21//

theta為 a,b 向量的夾角

22//

如果 a 在 b 的順時針方向180度內,則theta取正值

23//

向量叉乘

24//

返回值為正時,表示 a 在 b 的右側180度內

25//

返回值的絕對值等於以a,b向量為鄰邊的平行四邊型的面積

26const

double

operator ^(vec a, vec b)

2930

double lenth(vec &v)

3334

35//

將點 a 繞 p 逆時針旋轉 theta 角度(弧度制)

36//

1.平移座標

37//

2.旋轉

38//

3.平移座標

39 vec rotate(point a, point p, double

theta)

4445

46//

計算c到ab的距離

47//

isseg = 1 : ab為線段

48//

isseg = 0 : ab為直線

49double linepointdist(point a, point b, point c, bool

isseg)

57return

fabs(dist);58}

5960

//判斷線段的兩個端點是否在直線的兩側

61bool

linecrossseg(point p1, point p2, point ls, point le)

6266

67//

68//

叉積為 0 表示共線

69bool pointonseg(point s1, point s2, point p, bool

includeend)

7091

9293

//判斷兩條線段是否相交

94//

兩次跨立試驗

95 typedef pairseg;

96bool segcrossseg(seg a, seg b, bool

includeend)

97107

108double areapoly(vector&p)

113return area / 2.0

;114 }

points

基於直線的運算(直線方程 : ax+by=c)

1

struct

line

5 line():a(0.0),b(0.0),c(0.0

){}6};7

8line getlinefrompoints(point p1, point p2)

1415

//int = 0 無交點

16//

int = 1 乙個交點

17//

int = 2 兩直線重合

18 pairint>intersectpoint(line l1, line l2)

28else

33 }

lines

凸包模板(白書)

1

bool

cmpxy(point a, point b)26

//包含邊上的點就將 <= 改為 <

7int convexhull(point *p, intn)8

16int k =top;

17for (int i=n-2;i>=0;i--)

1822

if (n > 1) top--;

23return

top;

24 }

convexhull

旋轉卡殼

1

//s 為儲存有序的凸包點的下標的棧2//

此處的凸包點為順時針的順序

3int rotatingcaliper(point *p, int

top)417

return

ans;

18 }

rotatingcaliper

計算幾何模板整理

太難的比如三維凸包已過濾,估計noi考不了毒瘤計算幾何吧,不過還是背些簡單的吧。二維凸包 includeusing namespace std struct nodep 10001 q 10001 int n,top double ans node operator node a,node b do...

計算幾何模板

sgn返回x經過eps處理的符號,負數返回 1,正數返回1,x的絕對值如果足夠小,就返回0。const double eps 1e 8 int sgn double x double mysqrt double x pt是point的縮寫 int版 struct pt pt int x,int y ...

計算幾何模板

include define vct point using namespace std const double pi atan2 0,1 const double eps 1e 8 int sgn double d struct point bool operator point b const...