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座標都最小的點,其餘的點計算它們的極座標幅角,以幅角的非降序順序來排序,如果有幅角...