ACM幾何問題

2021-06-27 02:05:18 字數 1740 閱讀 5484

今天覆習了一下幾何的基礎內容,順便整理了一下。

其實幾何也挺簡單的,只要熟練掌握點積和叉積,這些都是易學易懂的。

1.點、直線、線段、圓、三角形、多邊形、矩形->判相交,判位置,求交點,求最近點,求特殊點(三角形六心等)

2.凸包(水平序,極角序)*(規範,非規範)

3.半平面交(求核)

4.旋轉卡殼(多邊形直徑、寬度,兩個多邊形間的最近最遠距離)

5.掃瞄線(坑)

6.kd-樹(坑)

7.三角剖分

基礎概念及知識:

向量(x, y)的極角就是atan2(y, x);

兩個向量的點積就等於x1 * x2 + y1 * y2;夾角小於90度為正。

兩個向量的叉積就等於x1 * y2 - y1 * x2;某向量與他左邊的向量叉積為正。

叉積的結果即為兩向量所組成的平行四邊形的面積。

向量旋轉公式:x' = x * cosa - y * sina, y' = x * sina + y * cosa。

點到直線的距離:平行四邊形的面積除以底。

線段相交:每條線段的兩個端點都在另一條線段的兩側,即叉積的符號不同。

//定義

struct point

}; typedef point vector;

//向量相加

vector operator + (vector a, vector b)

//比較<

bool operator < (const point &a, const point &b)

//比較==

bool operator == (const point &a, const point &b)

//三態函式

const double eps = 1e - 10;

int dcmp(double x)

//點積

double dot(vector a, vector b)

//求向量長度

double length(vector a)

//求兩向量夾角

double angle(vector a, vector b)

//叉積

double cross(vector a, vector b)

//面積

doubel area2(point a, point b, point c)

//向量旋轉   rad是弧度

vector rotate(vector a, double rad)

//點到直線的距離

double distancetoline(point p, point a, point b)

//點到線段的距離

double distancetosegment(point p, point a, point b)

//點p在直線ab上的投影q

point getlineprojection(point p, point a, point b)

//線段相交

bool segmentproperintersection(point a1, point a2, point b1, point b2)

bool onsegment(point p, point a1, point a2)

//計算多邊形的有向面積

double polygonarea(point *p, int n)

return area / 2; }

ACM 計算幾何

1.找凸包的最小寬度 include using namespace std double eps 1e 10 考慮誤差的加法運算 double add double a,double b struct p p double x,double y x x y y p operator p p p o...

ACM 幾何基礎(6)

幾何基礎 6 求多邊形面積 要想計算多邊形的面積我們可以轉化為求多個三角形的面積之和得到 在解析幾何裡,abc的面積可以通過如下方法求得 點座標 邊長 海 式 面積但是問題就出現在這裡了,用這種方法做的話,計算量大,精度損失。這裡就利用到叉積了 叉積的幾何意義 叉積的長度 a b 可以解釋成以a和 ...

ACM計算幾何 三維幾何模板

三維幾何函式庫 include define eps 1e 8 define zero x x 0?x x eps vlen xmult subt p,s.b subt p,s.c eps vlen xmult subt p,s.c subt p,s.a eps int dot inplane ex...