二維凸包演算法

2021-07-03 17:55:55 字數 1638 閱讀 4276

部落格參考:

謝謝 【chao_xun】把凸包寫的這麼詳細。

關於凸包的問題的解決的最初思路是這樣的。

<1>找到乙個基準點《必須在凸邊上》

<2>以基準點做射線,然後將該射線向固定方向旋轉,直到接觸到乙個新的點。

<3>以<2>中找到的點作為新的基準點,作射線繼續朝著一開始的固定的方向旋轉

<4>反覆重複2,3直到最後所有邊閉合起來

如下圖:

** 下文是參照了【chao_xun】部落格中的演算法的理解寫出的步驟

1.首先選取乙個極點,最下邊的點,若最低高度相等取最左邊(只要保證此點必為凸邊上的點即可),以此作為基準點;

2.易知,該點一定在凸包的邊上,所以可以以該點與另外乙個點連線成邊,作為凸包的邊:以基準點為射線的端點,做一條x軸正方向的水平射線,掃面各個點與基準點所構成的向量與x軸正方向所構成的夾角,依照夾角進行排序,然後進行第三步的連邊(排序的作用意義非常),下圖是掃瞄排序的結果

3.接下來開始連邊了

為了方便,以下圖作為輔助

說明部分:

1. 經過第二步的掃瞄之後得到點的排列順序為 a,b,c,d,e,f,其中a為基準點,數字分別表示兩點連線成的邊。

2. 規定按照逆時針方向為固定旋轉方向,各點的連線順序按照排序的結果,所以連線就有了邊,可知邊是由前一段射線逆時針旋轉過去。

3. 然後按照排序後的結果,嘗試連線,可知 也是以b為端點,方向與1相同的射線逆時針旋轉,方向仍然是逆時針,此時也沒有問題。

4. 然後按照排序的結果,連線,這時發現是順時針旋轉了,問題就來了,與我們規定的方向不相同,於是撤銷邊和邊,直接連線形成邊。

也就是說:假設 三個點 p2 , p3 , p4 ,數字代表他們在連邊過程中加入的順序,那麼向量 p3p4一定是由向量p2p3由固定方向(逆時針)旋轉過去的,如果不是,則需要將p3刪除,直接連點p2和點p4,文字略為囉嗦,具體參照上圖說明

最終反覆迴圈可以連成凸包。

關於整個演算法,上面都只是步驟,個人的理解是這樣的,排序後的各點的按順序連線,最後頭尾相連,其實就是結果,但是這個結果是粗糙的,為了使之成為真正的結果–凸包(也就是包含各個點,但是邊長最短的圖形),由三角形兩邊之和大於第三邊,我們可以通過旋轉判斷從而去掉使圖形凹陷的點,得到最終結果。

關於判斷兩個向量之間的旋轉是逆時針還是順時針,可以把二維向量擴充成三維,然後進行叉乘運算進而判斷

如兩個向量a=(xa,ya,0), b=(xb,yb,0)

由叉乘的運算得到 a x b=0 * i+0 * j+k(xa * yb - xb * ya);

所以只需要判斷(xa * yb - xb * ya)的正負就可以確定旋轉方向;

最後,個人水平是在有限,理解難免有錯漏之處,希望大家指正。

二維凸包 Andrew演算法

把給定點包圍在內部的 面積最小的凸多邊形 設向量 p x1,y1 q x2,y2 則 p q x1 y2 x2 y1 其結果是乙個由 0,0 p,q,p q 所組成的平行四邊形的 帶符號的面積,p q q p p q p q 叉積的乙個非常重要的性質是可以通過它的符號來判斷兩向量相互之間的順逆時針關...

求二維凸包演算法詳解

凸包 convex hull 是乙個計算幾何 圖形學 中的概念。用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊型,它能包含點集中所有點的。嚴謹的定義和相關概念參見 維基百科 凸包 這個演算法是由數學大師葛立恆 graham 發明的,他曾經是美國數學學會 ams 主席...

二維凸包求解(Andrew演算法 )

andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積為負值 就刪除一些點,使得又能夠維持凸的形態。這時就會發現,處理各個點需要按照x從左往右的順序,排序即可 當然,這只是處理了下凸的乙個凸殼,倒過來再刷一次,就得到了整個凸包 include...