凸包問題 Graham Scan

2021-07-29 21:51:21 字數 703 閱讀 8943

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 100000000

int 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 演...