graham scan 概述:
對於凸多邊形的定義不在這裡做詳細敘述,這裡給出演算法的實現原理。
step 1:
找出x值最小的點的集合,從其中找出y值最小的點作為初始點
step 2:
獲得新序列後,p[n]=p[1]
step 3:
把p[0],p[1],p[2]放入乙個棧,從i=3迴圈到i=n-1,取棧頂兩個元素和p[i]連線,如果未形成左旋,棧頂元素退棧,直到棧中元素僅剩兩個。
將p[i]壓入棧。
c++**:
#include #define max_n 100000000int top;//
凸包的頂點個數
typedef std::pairpoint;
int dis(point p1, point p2)//
兩點的距離的平方
point p[max_n];
//向量p0p1和向量p0p2的叉積
intmulti(point p1, point p2, point p0)
bool
cmp(point a, point b)
//graham_scan的精華
void graham_scan(point p, point stack, intn)}
凸包問題 Graham Scan演算法
平面中取一定點a,從a點出發的一條射線am,再選定乙個長度單位和角度的正方向 通常取逆時針方向 對於平面內任意一點b,都可以用有序對 這樣建立的座標系稱為極座標系,定點a稱為極點,射線am稱為極軸,若極座標系中定點a與直角座標系的原點o重合,極座標系中的極軸為直角座標系x軸正半軸,於x軸逆時針成90...
凸包 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 演...