尋找凸包的graham 掃瞄法

2021-08-30 12:11:40 字數 1542 閱讀 8412

1,點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。

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

3,graham掃瞄法:

首先,找到所有點中最左邊的(y座標最小的),如果y座標相同,找x座標最小的.

以這個點為基準求所有點的極角(atan2(y-y0,x-x0)),並按照極角對這些點排序,前述基準點在最前面,設這些點為p[0]..p[n-1.

注:這樣預處理後,保證p[0],p[1]和p[n-1]都是凸包上的點.

建立乙個棧,初始時p[0]、p[1]、p[2]進棧,對於 p[3..n-1]的每個點,若棧頂的兩個點與它不構成"向左轉"的關係,則將棧頂的點出棧,直至沒有點需要出棧以後將當前點進棧;

所有點處理完之後棧中儲存的點就是凸包了。

圖示:[img]

4,實現**

#include

#include

using namespace std;

/*pointset:輸入的點集

ch:輸出的凸包上的點集,按照逆時針方向排列

n:pointset中的點的數目

len:輸出的凸包上的點的個數

*/struct point

;//小於0,說明向量p0p1的極角大於p0p2的極角

float multiply(point p1,point p2,point p0)

float dis(point p1,point p2)

void graham_scan(point pointset,point ch,int n,int &len)

len=top+1;

}const int maxn=1000;

point pointset[maxn];

point ch[maxn];

int n;

int len;

int main()

;float y=;

for(int i=0;i

#include

using namespace std;

/*pointset:輸入的點集

ch:輸出的凸包上的點集,按照逆時針方向排列

n:pointset中的點的數目

len:輸出的凸包上的點的個數

*/struct point

;//小於0,說明向量p0p1的極角大於p0p2的極角

float multiply(point p1,point p2,point p0)

float dis(point p1,point p2)

void graham_scan(point pointset,point ch,int n,int &len)

len=top+1;

}const int maxn=1010;

point pointset[maxn];

point ch[maxn];

int n;

int len;

int main()

尋找凸包的graham 掃瞄法

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

凸包(Graham掃瞄法構建)

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

凸包問題 Graham掃瞄法

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