二維計算幾何演算法 學習筆記

2021-10-02 23:39:22 字數 1457 閱讀 4393

即 a⃗=

(x1,

y1

)\vec a=(x_1,y_1)

a=(x1​

,y1​

),b⃗=(

x2,y

2)

\vec b=(x_2,y_2)

b=(x2​

,y2​

)兩個向量間的常見的運算有點積和叉積(內積和外積)。

點積: a⃗⋅

b⃗=x

1x2+

y1y2

\vec a·\vec b=x_1x_2+y_1y_2

a⋅b=x1

​x2​

+y1​

y2​叉積:a⃗×

b⃗=x

1y2−

y1x2

\vec a×\vec b=x_1y_2-y_1x_2

a×b=x1

​y2​

−y1​

x2​點積可以用於判斷兩向量的夾角是銳角還是鈍角

叉積比較有用,其值能表示兩個向量組成的平行四邊形的面積(並且是有向的,遵守右手法則)

eg.p2785 這裡就是應用了三角形叉積能表示面積這一點,將多邊形以平面上某點分割成很多三角形,從而計算出任意多邊形的面積

p4894 這是用到了三維叉積,所得結果垂直於二維兩向量的特點,可以快速求出法向量。

記錄直線需要兩個引數,直線上的乙個點和直線的方向向量。

按順序記錄其所有頂點即可儲存乙個多邊形

凸多邊形是研究的比較多的乙個領域。

多邊形和點的關係比較重要,即多邊形是否包含點

一般有兩種辦法:

①從這個點引出一條射線,如果穿越多邊形邊界奇數次則在內,穿越偶數次在外

②這個點與相鄰頂點連線構成的有向角,如果其加和為 2

π2\pi

2π則在多邊形內,加和0在外。但這個速度較慢(用反三角函式多次),一般採用從點引出一條向右的水平線,判斷多邊形有向邊穿越這個線多少次

eg.poj2318 判斷點是否在某個多邊形內,特化了方法②,用二分法縮減多邊形

p1355 判斷點是否在三角形內,邊上,頂點上。做法是類似的

用n個點構造最小凸多邊形的o(n)演算法,運用了外積表示了當前邊的前進方向。

本身並不難,但是經常一些和它相距甚遠的結構可以通過建模轉化為它,這是最難的

小知識點:旋轉卡殼,即凸包直徑,凸包上的兩個最遠頂點

eg.p2742 構建凸包模板題

p2116通過建模才能想到要把城堡這個任意多邊形轉化成凸多邊形

p1452先構建凸包,再找直徑的模板題

給出n個點,構造最小的能覆蓋它們的圓

看似很像旋轉卡殼,但是對於正奇數邊形很容易發現都不符合最小圓覆蓋。

這裡用的是隨即增量(即先打亂再數學歸納)

eg.p1742模板題

和數學裡的動態規劃一致,但是**上實現比較複雜。

eg.p4196 構建半平面交後,求多邊形面積

計算幾何 二維幾何 模板

幾何意義 向量的點積 a b a b a b cos cos 若cos cos 為正,兩向量之間的夾角為銳角 為負,兩向量夾角為鈍角 為量,兩向量夾角為直角。b在a方向上的投影 向量的叉積 a b a b a b sin sin 數值上表示a和b構成的平行四邊形的面積。include using n...

二維計算幾何複習

二維計算幾何 宣告 由於本人較弱,並不能保證以下內容的100 正確 歡迎大佬來挑錯 基本定義 1 struct point 6 point double xx,double yy 9 10 typedef point vec 1112 vec operator vec v1,vec v2 15 ve...

二維幾何模板 二維幾何基礎

二維幾何模板 include include include include include include include include include using namespace std 二維幾何基礎 struct point typedef point vector const doub...