計算幾何筆記之凸包

2021-09-17 01:15:52 字數 1126 閱讀 8280

在乙個實數向量空間 v 中,對於給定集合 x ,所有包含x的凸集的交集 s 被稱為 x 的凸包。

在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。

由最底的一點a_1開始(如果有多個這樣的點,那麼選擇最左邊的),計算它跟其他各點的連線和x軸正向的角度,按小至大將這些點排序,稱它們的對應點為 a2 , a3 , . . . , an 。這裡的時間複雜度可達 o(nlog n)。

考慮最小的角度對應的點 a3。若由 a2 到 a3 的路徑相對 a1 到 a2 的路徑是向右轉的表示 a3 不可能是凸包上的一點,考慮下一點由 a2 到 a4 的路徑;否則就考慮 a3 到 a4 的路徑是否向右轉……直到回到 a1。

這個演算法的整體時間複雜度是 o(nlog n),注意每點只會被考慮一次.

這個演算法由葛立恆在2023年發明。[1]它的缺點是不能推廣到二維以上的情況。

我們首先要有乙個 to_left_test的方法:

bool toleft(p,q,s);
假設p,q為極點,那麼s一定位於pq連線的左側,是則返回true,否則返回false.對於極邊,非p,q的所有點都應滿足這一條件。(對於判斷是否在左側,我覺得具體可以結合到斜率來判斷)。

對於convex hull,其最下方(上,左,右同理)點一定是極點。我們可以讓最下方點為graham演算法的起始極點a0。根據其他點與a0的角度從下到大來編號,從而繼續進行graham演算法。a1也一定是極點。

我們應該維持兩個棧s,t。s用於存放在當下滿足極點要求的點,初始值為a0,a1。t存放還未判斷的點(剩餘的ai逆序存放,即下標大的在棧底)。每次從t中pop出乙個點ai,滿足toleft(s[-2],s[-1],ai)==true,則push進s(所謂的leftturn),否則將s[-1]pop出,繼續測試toleft(s[-2],s[-1],ai)(所謂的rightturn,進行了一次backtrack).

最後s中的所有點都應該是極點。

計算幾何之凸包

今天我們要涉及計算幾何中的凸包。凸包 convex hull 是乙個計算幾何 圖形學 中的概念。凸包這個東西,我們其實並不陌生,因為在斜率優化的時候我們就需要用到凸包來進行輔助。但是今天講的是怎麼求出凸包。在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用...

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...