計算幾何(學習)模板

2021-09-08 03:34:12 字數 2140 閱讀 6475

點結構:

struct point

};

浮點誤差處理:

int dblcmp(double x)

或者int dblcmp(double x)

判斷線段是否相交並求交點(規範相交)

double det(double x1, double y1, double x2, double y2)

double cross(point a, point b, point c)

double dotdet(double x1, double y1, double x2, double y2)

double dot(point a, point b, point c)

int betweencmp(point a, point b, point c)

bool segcross(point a, point b, point c, point d)

//非規範相交

if((d1 == 0 && betweencmp(c, a, b) <= 0) ||

(d2 == 0 && betweencmp(d, a, b) <= 0) ||

(d3 == 0 && betweencmp(a, c, d) <= 0) ||

(d4 == 0 && betweencmp(b, c, d) <= 0))

return true;

return false;

}

叉積求多邊形面積

double area(point p,int n)

三角形面積:

1. 海**式

p = (a+b+c)/2;  

s = sqrt(p*(p-a)*(p-b)*(p-c));

2:叉積求解:一直三點:

a(x1,y1),b(x2,y2),c(x3,y3);  

s = fabs(-x2 * y1 + x3*y1+x1*y2-x3*y2-x1*y3+x2*y3) / 2.0;

判斷多邊形是否為凸多邊形

輸入p[1],p[2] ...p[n]。 令p[0] = p[n] p[n + 1] = p[1]; 

bool isconvexpg()

return true;

}

判斷一點是否在多邊形內,環顧法:

double getdis(point a,point b)

//利用點積求角度

double getangle(point a,point b,point c)

//判斷是否在多邊形內

bool isin()

//printf("angle == %lf\n",angle);

if (dblcmp(angle) == 0) return false;//在外邊

else if (dblcmp(angle - pi) == 0 || dblcmp(angle + pi) == 0)//在邊上

else if (dblcmp(angle - 2.0*pi) == 0 || dblcmp(angle + 2.0*pi) == 0)//在裡面

else //在多邊行頂點

return false;

}

求凸包的graham_scan演算法模板

//這裡起點與終點肯定在凸包上,不知道怎麼證明

int graham(point *p,int len)

//求左鏈

int tmp = top;

for (i =len - 2; i >= 0; --i)

return top - 1;//起點兩次進棧 - 1

}

利用凸包求最遠點距離——旋轉卡殼法:

int rotaing(point *p,int len)

return ans;

}

計算幾何學習筆記

基礎部分 include using namespace std define type double define vector point define eps 1e 8 const double pi 3.14159265358979323 type deg2red type deg type...

計算幾何學習筆記

計算幾何是什麼東西?能吃嗎?給定 n 個點 x i,yi 問 歐幾里得 距離最近的點對。如果用樸素的兩兩枚舉,需要o n2 的時間。考慮用分治法,先將點按照先 x 後 y排序。考慮對一段點 l r 的處理。在 放一根平行於y軸的線,其左邊的答案為a,右邊為b,設 min a,b 考慮如果有跨這條線的...

計算幾何學習筆記

計算幾何基本採用向量來表示點 線 麵等基本元素,而非我們平時常用的解析式。向量的基礎運算法則 給定兩個向量 p x 1,y 1 q x 2,y 2 加法 p q x 1 x 2,y 1 y 2 減法 p q x 1 x 2,y 1 y 2 數乘 lambda p lambda x 1,lambda ...