凸包演算法詳解 Graham掃瞄法

2021-08-22 00:03:36 字數 1144 閱讀 9510

凸包:給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊型,它能包含點集中所有的點。如圖所示(來自wiki)

步驟:1、先將點按從下向上,從左向右的順序排序。排完序的第乙個點,一定為凸包上的點,記為p0。

2,計算各個點相對於 p0 的幅角 α ,按從小到大的順序對各個點排序。當 α 相同時,距離 p0 比較近的排在前面。我們由幾何知識可以知道,結果中第乙個點 p1 和最後乙個點一定是凸包上的點。 

(以上是準備步驟,以下開始求凸包) 

3、將p0、p1放進棧裡,從p2開始為當前點,開始求凸包,找第三個點。

4.連線p0和棧頂的那個點,得到直線 l(方向由p0指向棧頂那個點) 。看當前點是在直線 l 的右邊還是左邊。如果在直線的右邊就執行步驟5;如果在直線上,或者在直線的左邊就執行步驟6。

5.如果在右邊,則棧頂的那個元素不是凸包上的點,把棧頂元素出棧。執行步驟4。

6.當前點是凸包上的點,把它壓入棧,執行步驟7。

7.檢查當前點 p 是不是最後乙個點,是最後乙個元素的話就結束。如果不是的話就把 p2 後面那個點做當前點,返回步驟4。

最後,棧中的元素就是凸包上的點了。

#include#include#include#include#includeusing namespace std;

struct node

;node vex[1000];//存入的所有的點

node stackk[1000];//凸包中所有的點

int xx,yy;

bool cmp1(node a,node b)//排序找第乙個點

double dis(node a,node b)//計算距離

bool cmp2(node a,node b)//極角排序另一種方法,速度快

int main()

stackk[++top]=vex[i]; //滿足的入棧

}for(i=0; i<=top; i++)

cout<

}

凸包(Graham掃瞄法構建)

ps 我的媽呀,心態 好像也不太難,看各種模板看的雲裡霧裡的,真的還是自己動手敲來的好,幾乎沒多久就懂的差不多了。乙個本該寒假就該掌握的知識,居然熬了我幾個小時。這一次還是很好的了解了凸包,以前看群裡學長們說,覺得好高大上,好難的樣子,仔細了解後發現其實也沒有想象中的那麼恐怖 凸包基本概念 這就是乙...

凸包問題 Graham掃瞄法

凸包點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。右圖中由紅色線段表示的多邊形就是點集q 的凸包。頂點個數n 1 排序 在點集q中找最左下方的點p0,就是x座標和y座標都最小的點,其餘的點計算它們的極座標幅角,以幅角的非降序順序來排序,如果有幅角...

尋找凸包的graham 掃瞄法

1,點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。2,凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法。3,graham掃瞄法 首先,找到所有點中最左邊的 y座標最小的 如果y座標相同,找x座標最小的.以這個點為基準求所有點的極角 ...