在學習了一些有關計算機幾何的基礎知識和一些基本工具之後要快速的解決一些簡單的幾何問題,如兩點之間的距離、兩線段的交點個數等等是可以輕鬆應付的,但是對於複雜點的幾何問題,我們還是要有更好的演算法,這樣才可以更高效的解決它。在這一篇中來總結 平面凸包 的 graham演算法;
平面凸包 :
定義: 對乙個簡單多邊形來說,如果給定其邊界上或內部的任意兩個點,連線這兩個點的線段上的所有點都被包含在該多邊形的邊界上或內部的話,則該多邊形為凸多邊形 。
在解決平面凸包下面介紹了兩種演算法:
一、 graham掃瞄法,執行時間為o(nlgn)。
二、 jarvis步進法,執行時間為o(nh),h為凸包中的頂點數。
1 問題描述1:2 求覆蓋平面上n 個點的最小的凸多邊形。也可以這樣描述:給定乙個連線的多邊形,可能是凸多邊形,也有可能是凹多邊形。現在,你的任務就是程式設計求這個多邊形的最小凸包。如果它本身是凸多邊形,那麼最小凸包就是它本身。
3 資料範圍:
4 多邊形頂點座標x,y 是非負整數,不超過512。
5 輸入:
6 共有k 組資料,每組測試資料的點都是按逆時針順序輸入的,沒有3 個點共線。
7 每組測試資料的第1 行是n,表示有n 個點。以下n 行,每行兩個整數x,y。
8 輸出:
9 輸出格式與輸入格式一樣,第一行是k,表示共有k 組輸出。以下k 組資料:
10 每組的第一行為m,表示該凸包上有m 個頂點,以下m 行每行兩個整數x,y,表示凸包頂點的座標。也按逆時針方向輸出。
11 樣例輸入:121
1314
1430
3015
5060
1660
2017
7045
1886
3919
11260
20200
11321
25050
22300
20023
130240
2476
15025
4776
2636
4027
3335
28 樣例輸出:291
graham掃瞄法
基本思想:通過設定乙個關於候選點的堆疊s來解決凸包問題。
操作:輸入集合q中的每乙個點都被壓入棧一次,非ch(q)(表示q的凸包)中的頂點的點最終將被彈出堆疊,當演算法終止時,堆疊s中僅包含ch(q)中的頂點,其順序為個各頂點在邊界上出現的逆時針方向排列的順序。
注:下列過程要求|q|>=3,它呼叫函式top(s)返回處於堆疊s 頂部的點,並呼叫函式next-to –top(s)返回處於堆疊頂部下面的那個點。但不改變堆疊的結構。
graham-scan(q)
1
設p0 是q 中y 座標最小的點,如果有多個這樣的點則取最左邊的點作為p0;
2
設是q 中剩餘的點,對其按逆時針方向相對p0 的極角進行排序,如果有數個點有相同的極角,則去掉其餘的點,只留下乙個與p0 距離最遠的那個點;
3
push(p0 , s)
4
push(p1 , s)
5
push(p3 , s)
6
for i ← 3 to m
7
do while 由點next-top-top(s),top(s)和pi 所形成的角形成一次非左轉
8
do pop(s)
9
push(pi , s)
10
return s
首先,找乙個凸包上的點,把這個點放到第乙個點的位置p
0。然後把p1~pm 按照p0pi的方向排序,可以用向量積(叉積)判定。
做好了預處理後開始對堆疊中的點中的每乙個點進行迭代,在第7到8行的while迴圈把發現不是凸包中的頂點的點從堆疊中移去。(原理:沿逆時針方向通過凸包時,在每個頂點處應該向左轉。因此,while迴圈每次發現在乙個頂點處沒有向左轉時,就把該頂點從堆疊中彈出。)當演算法向點pi推進、在已經彈出所有非左轉的頂點後,就把pi壓入堆疊中。
舉例如下:
非常感謝:archive/2011/08/05/2128625.html
計算幾何 凸包演算法
凸包演算法總結 凸包是指覆蓋平面座標系內若干點的面積最小的凸多邊形。求凸包的第一步是確定 凸包的定點都在給定的點中。通過幾何方法反證很容易得到這一結論。所以,只要從所有點中挑選若干正確的點,按順序 順時針或逆時針 排列,就相當與求得了凸包。計算幾何中的凸包問題程式 graham演算法 include...
計算幾何 凸包演算法 收藏
計算幾何 凸包演算法 收藏 計算幾何中的凸包問題程式 graham演算法 i nclude i nclude i nclude define maxn 10000 頂點的型別定義 typedef struct point1 int n 頂點的個數 point1 points maxn 頂點陣列 in...
計算幾何 凸包
有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...