尋找凸包的graham 掃瞄法

2021-06-07 01:55:40 字數 2362 閱讀 7697

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]的每個點,若棧頂的兩個點與它不構成"向左轉"的關係,則將棧頂的點出棧,直至沒有點需要出棧以後將當前點進棧; 

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

圖示: 

4,實現** 

cpp**  

#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)  

//第三個點先入棧

ch[0]=pointset[0];  

ch[1]=pointset[1];  

ch[2]=pointset[2];  

//判斷與其餘所有點的關係

for (i=3;i  

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  

graham_scan(pointset,ch,n,len);  

for(int i=0;icout

}  

5,應用:

實現**: 

cpp**  

#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)  

//第三個點先入棧

ch[0]=pointset[0];  

ch[1]=pointset[1];  

ch[2]=pointset[2];  

//判斷與其餘所有點的關係

for (i=3;i  

len=top+1;  

}  const

int maxn=1010;  

point pointset[maxn];  

point ch[maxn];  

int n;  

int len;  

int main()    

附:向量叉積

設有點p0(x0,y0),p1(x1,y1),p2(x2,y2).(p0p1),(p0p2)是共p0的兩條向量,叉積d = (p0p1)x(p0p2) = (x1-x0)*(y2-y0) - (x2-x0)*(y1-y0)

叉積的乙個非常重要性質是可以通過它的符號判斷兩向量相互之間的順逆時針關係:

若 d > 0 , 則(p0p1)在(p0p2)的順時針方向。 

若 d < 0 , 則(p0p1)在(p0p2)的逆時針方向。(圖示方向)

若 d = 0 , 則(p0p1)與(p0p2)共線,但可能同向也可能反向。

from: 

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