計算幾何 : 凸包學習筆記 --- Graham 掃描法
阿新 • • 發佈:2019-01-25
凸包
(只針對二維平面內的凸包)
一、定義
簡單的說,在一個二維平面內有n個點的集合S,現在要你選擇一個點集C,C中的點構成一個凸多邊形G,使得S集合的所有點要麼在G內,要麼在G上,並且保證這個凸多邊形的面積最小,我們要求的就是這個C集合。
二、演算法
求凸包的演算法很多,常用的有兩種:
1. Graham掃描法,執行時間為O(nlgn)。
2. Jarvis步進法,執行時間為O(nh),h為凸包中的頂點數。
這裡主要討論第一種演算法:Graham掃描法
Graham掃描法:
基本思想:使用一個棧來對所有點逐一判斷,把不符合條件的點篩出去。
操作:輸入集合Q中的每一個點都被壓入棧一次,非CH(Q)(表示Q的凸包)中的頂點的點最終將被彈出堆疊,當演算法終止時,堆疊S中僅包含CH(Q)中的頂點,其順序為個各頂點在邊界上出現的逆時針方向排列的順序。
首先,找一個凸包上的點,把這個點放到第一個點的位置P0。然後把P1~Pm 按照P0Pi的方向排序,可以用向量積(叉積)判定。
判定過程:
做好了預處理後開始對堆疊中的點<p3,p4,...,pm>中的每一個點進行迭代,在第7到8行的while迴圈把發現不是凸包中的頂點的點從堆疊中移去。(原理:沿逆時針方向通過凸包時,在每個頂點處應該向左轉。因此,while迴圈每次發現在一個頂點處沒有向左轉時,就把該頂點從堆疊中彈出。)當演算法向點pi推進、在已經彈出所有非左轉的頂點後,就把pi壓入堆疊中。
整個演算法過程如圖所示: