凸包問題之GrahamScan法

2021-07-08 16:03:59 字數 1185 閱讀 6367

grahamscan法:當沿著convex hull逆時針漫遊時,總是向左轉;在極座標系下按照極角大小排列,然後逆時針方向漫遊點集,去除非conves hull頂點(非左轉點)。

實現**如下:

#include#include#include#define max_size 10001

struct point;

//在比較極角大小時作為標準的點

struct point p0;

//計算極角大小

double cross(struct point p1,struct point p2,struct point p0)

//計算兩點間距離

double distance(struct point a,struct point b)

//按極角大小排序

int cmpgraham(const void *a,const void *b)

int grahamscan()

} //start = gettickcount();

queryperformancecounter(&li);

start = li.quadpart;

//將第乙個點換為y軸上值最小的點

p[k] = p[0];

p[0] = p0;

//關於極角排序,確定p0後,就變成在另乙個座標系下了

k=0;j=0;

for(i=1;i1 && g(p[i],p[stack[top-1]],p[0])*g(p[i],p[stack[top-1]],p[stack[top]])>=0)

top--;

stack[++top] = i;

} //end = gettickcount();

// 獲取結束時間

queryperformancecounter(&li);

end = li.quadpart;

printf("結果集:\n");

j=0;

for(i=0;i<=top;i++)

printf("\n");

//printf("經歷時間為%.2f\n\n",end-start);

printf("經歷時間為%dms\n\n",(int)1000 * (end-start) / fred);

} return 0;

}

凸包問題 Graham Scan

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,取棧頂兩個元...

凸包問題 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.掃瞄每乙個點,用叉積...