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