凸包 Graham Scan演算法

2021-07-09 14:09:46 字數 1343 閱讀 8533

graham-scan演算法是一種靈活的凸包演算法,時間複雜度是o(nlogn)

演算法細節:

1. 選出最左下角的點(排序:x最小,其次是y最小)

2. 其餘點按極角排序,在極角相等的情況下距離極點(p[0])最近的優先

3. 用乙個棧(陣列)儲存凸包上的點,先把p[0],p[1]壓入棧。

4. 掃瞄每乙個點,用叉積判斷新點和棧頂頭兩個點形成的拐向。順時針就彈出棧頂元素,繼續判斷。否則壓入新點p[i]

(判斷的前提是棧內已經壓入了兩個點)

5. 最終棧內元素就是凸包點。

附圖說明(接下來看圖,用心感受):

還是那一道凸包入門題,之前用捲包裹法做過:

現在用graha-scan演算法做,更加高效:

poj 1113 wall

poj.org/problem?id=1113

#include #include #include #include using namespace std;

const double eps=1e-7,pi=3.1415926;

struct pointp[1005],ans[1005];

int cross(point p0,point p1,point p2)

double dis(point a,point b)

int cmp1(point p1,point p2)

int top;

void convex(int n)

}ans[top++]=p[0];

}int main()

{ //freopen("cin.txt","r",stdin);

int n,l;

while(cin>>n>>l){

for(int i=0;i

Graham Scan凸包演算法

一 什麼是凸包 在乙個二維座標系中,有若干點雜亂排列著,將最外層的點連線起來構成的凸多邊型,它能包含給定的所有的點,這個多邊形就是凸包。尋找凸包的演算法有很多種,graham scan 演算法是一種十分簡單高效的二維凸包演算法,能夠在 o nlogn 的時間內找到凸包。二 graham scan 演...

凸包Graham Scan演算法實現

凸包演算法實現點集合中搜尋凸包頂點的功能,可以處理共線情況,可以輸出共線點也可以不輸出而只輸出凸包頂點。經典的graham scan演算法,點排序使用極角排序方式,並對共線情況做特殊處理。一般演算法是將共線的點去掉距離小的,保留最遠的,這樣處理會導致不能輸出凸包邊上的點,只能輸出頂點。但是有時候需要...

凸包問題 Graham Scan演算法

平面中取一定點a,從a點出發的一條射線am,再選定乙個長度單位和角度的正方向 通常取逆時針方向 對於平面內任意一點b,都可以用有序對 這樣建立的座標系稱為極座標系,定點a稱為極點,射線am稱為極軸,若極座標系中定點a與直角座標系的原點o重合,極座標系中的極軸為直角座標系x軸正半軸,於x軸逆時針成90...