Graham Scan凸包演算法實現

2021-09-24 20:28:43 字數 1321 閱讀 6637

今天實現以下graham scan演算法演算法,看了網上的資料,個人理解

1、找左下角點

2、對所有點相對該點的極角進行排序

3、將1、2入棧,以後的點逐個入棧,下乙個新點如果滿足逆時針旋轉(右手準則),則該點入棧,如果是順時針則該點放棄,再重複步驟 3,直到掃瞄到最後乙個點結束

這裡可以參考:

一下**是參考別人的,主要把輸入和輸出參量用容器代替

#include #include #include using namespace std;

struct point

;//小於0,說明向量p0p1的極角大於p0p2的極角,大於零,逆時針,小於零,順時針

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

float dis(point p1, point p2)

vectormy_graham_scan(vectorpointset, vectorhull)   // graham掃瞄法

} //將這個點指定為pointset[0]

tmp = pointset[0];

pointset[0] = pointset[k];

pointset[k] = tmp;

//按極角從小到大,距離偏短排前進行遍歷排序

for (i = 1; i0)         // k角大於i角 即基準角大於判斷角,進行交換

|| ((multiply(pointset[j], pointset[k], pointset[0]) == 0)

&& (dis(pointset[0], pointset[j]) < dis(pointset[0], pointset[k]))))    // 最近點  即基準角大於判斷角,進行交換

}tmp = pointset[i];

pointset[i] = pointset[k];

pointset[k] = tmp;

} //初始第一對向量,其中0,1位點邊界

hull.push_back(pointset[0]);

hull.push_back(pointset[1]);

hull.push_back(pointset[2]);

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

for (i = 3; i= 0)

//當前點與棧內所有點滿足向左關係,因此入棧.

hull.push_back(pointset[i]);

++top;

} return hull;

}void main()

system("pause");

}

凸包 Graham Scan演算法

graham scan演算法是一種靈活的凸包演算法,時間複雜度是o nlogn 演算法細節 1.選出最左下角的點 排序 x最小,其次是y最小 2.其餘點按極角排序,在極角相等的情況下距離極點 p 0 最近的優先 3.用乙個棧 陣列 儲存凸包上的點,先把p 0 p 1 壓入棧。4.掃瞄每乙個點,用叉積...

Graham Scan凸包演算法

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

凸包Graham Scan演算法實現

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