凸包學習筆記

2021-07-10 04:39:34 字數 2318 閱讀 8612

凸包

凸包(convex hull)是乙個計算幾何(圖形學)中的概念。

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

x的凸包可以用x內所有點(x1,…xn)的線性組合來構造.

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

用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊型,它能包含點集中所有的點。

定義

⒈對於乙個集合d,d中任意有限個點的線性組合的全體稱為d的凸包。

⒉對於乙個集合d,所有包含d的凸集之交稱為d的凸包。

可以證明,上述兩種定義是等價的

概念

1 點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。右圖中由紅色線段表示的多邊形就是點集q=的凸包。

2 一組平面上的點,求乙個包含所有點的最小的凸多邊形,這就是凸包問題了。這可以形象地想成這樣:在地上放置一些不可移動的木樁,用一根繩子把他們盡量緊地圈起來,並且為凸邊形,這就是凸包了。

平面求法

常見求法

凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法

graham』s scan法

這個演算法是由數學大師葛立恆(graham)發明的,他曾經是美國數學學會(ams)主席、at&t首席科學家以及國際雜技師協會(ija)主席。

問題 給定平面上的二維點集,求解其凸包。

過程 ⒈ 在所有點中選取y座標最小的一點h,當作基點。如果存在多個點的y座標都為最小值,則選取x座標最小的一點。座標相同的點應排除。然後按照其它各點p和基點構成的向量h,p;與x軸的夾角進行排序,夾角由大至小進行順時針掃瞄,反之則進行逆時針掃瞄。實現中無需求得夾角,只需根據餘弦定理求出向量夾角的余弦值即可。以下圖為例,基點為h,根據夾角由小至大排序後依次為h,k,c,d,l,f,g,e,i,b,a,j。下面進行逆時針掃瞄。

⒉ 線段h,k;一定在凸包上,接著加入c。假設線段k,c;也在凸包上,因為就h,k,c三點而言,它們的凸包就是由此三點所組成。但是接下來加入d時會發現,線段k,d;才會在凸包上,所以將線段k,c;排除,c點不可能是凸包。

⒊ 即當加入一點時,必須考慮到前面的線段是否會出現在凸包上。從基點開始,凸包上每條相臨的線段的旋轉方向應該一致,並與掃瞄的方向相反。如果發現新加的點使得新線段與上線段的旋轉方向發生變化,則可判定上一點必然不在凸包上。實現時可用向量叉積進行判斷,設新加入的點為pn + 1,上一點為pn,再上一點為pn - 1。順時針掃瞄時,如果向量pn - 1,pn;與pn,pn + 1;的叉積為正(逆時針掃瞄判斷是否為負),則將上一點刪除。刪除過程需要回溯,將之前所有叉積符號相反的點都刪除,然後將新點加入凸包。

在上圖中,加入k點時,由於線段h,c要旋轉到h,k的角度,為順時針旋轉,所以c點不在凸包上,應該刪除,保留k點。接著加入d點,由於線段k,d要旋轉到h,k的角度,為逆時針旋轉,故d點保留。按照上述步驟進行掃瞄,直到點集中所有的點都遍歷完成,即得到凸包。

複雜度

這個演算法可以直接在原資料上進行運算,因此空間複雜度為o⑴。但如果將凸包的結果儲存到另一陣列中,則可能在**級別進行優化。由於在掃瞄凸包前要進行排序,因此時間複雜度至少為快速排序的o(nlgn)。後面的掃瞄過程複雜度為o(n),因此整個演算法的複雜度為o(nlgn)。

jarvis步進法。

對於乙個有三個或以上點的點集q,過程如下:

計算點集最右邊的點為凸包的頂點的起點,如上圖的p3點。

do for i = 0 to 總頂點數

計算有向向量p3->pi

if 其餘頂點全部在有向向量p3->pi的左側或右側,則pi點為凸包的下一頂點

pi點加入凸包列表

goto 1

end if

next

exit do

1: loop

此過程執行後,點按極角自動順時針或逆時針排序,只需要按任意兩點的次序就可以了。而左側或右側的判斷可以用前述的向量點積性質實現。

中心法

先構造乙個中心點,然後將它與各點連線起來,按斜率遞增的方法,求出凸包上部;再按斜率遞減的方法,求出凸包下部。

水平法

從最左邊的點開始,按斜率遞增的方法,求出凸包上部;再按斜率遞減的方法,求出凸包下部。水平法較中心法減少了斜率無限大的可能,減少了**的複雜度。

快包法

選擇最左、最右、最上、最下的點,它們必組成乙個凸四邊形(或三角形)。這個四邊形內的點必定不在凸包上。然後將其餘的點按最接近的邊分成四部分,再進行快包法(quickhull)。

學習筆記 凸包

想學斜率優化,先把先決條件凸包給肝了。然後完全不懂,於是就咕了。順便看了一下線代 其實並不會 講真這東西耗了我半個暑假 20210305更新 po學了向量回來了發現這寫的什麼玩意,已更新完畢,您可從更新部分跳至凸包部分。同時,原 前置知識 叉積 部分已棄用並放置於最後。目錄更新 以下內容大部分在人教...

平面凸包 學習筆記

什麼是平面凸包?平面凸包 以下簡稱 凸包 是指覆蓋平面上n個點的最小凸多邊形。形象來說就是把n個點看成n根柱子,用橡皮筋去緊框住這n根柱子,最後形成的拉緊的多邊形就是要求的凸包。怎麼求平面凸包?1.jarvis演算法 首先我們需要了解凸包的數學構造法 找一條直線l過其中一點 記為a 並且其他所有點都...

OpenCV學習筆記(十五)之凸包

老規矩 妹妹鎮樓 輸入候選點,來自findcontours outputarray hull,凸包 bool clockwise,順時針方向 bool returnpoints,true表示返回點個數,如果第二個引數是vector則自動忽略 首先把影象從rgb轉為灰度影象 轉為二值影象 通過發現輪廓...