整理計算幾何模板,以及一些題目
update 1:基礎函式,點,向量的運算
update 2:凸包,旋轉卡殼
基礎的函式定義
1dcmpconst
double eps = 1e-8;2
int dcmp(double
x)
基於點和向量的運算
1pointsstruct
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 }
基於直線的運算(直線方程 : ax+by=c)
1linesstruct
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 }
凸包模板(白書)
1convexhullbool
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 }
旋轉卡殼
1rotatingcaliper//s 為儲存有序的凸包點的下標的棧2//
此處的凸包點為順時針的順序
3int rotatingcaliper(point *p, int
top)417
return
ans;
18 }
計算幾何模板整理
太難的比如三維凸包已過濾,估計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...