凸包:按橫座標排序,以最小點與最大點之間的連線為準,在直線一側找使三角形面積最大的點,此點必在凸包內,以找到點與最大點或最小點繼續遞迴以尋找最大三角形面積尋找凸包點,直至找不到符合條件的點。
實現**如下:
#include#include #include #define max_size 10001
struct point;
// 按照x的從小到大進行排序,x相同按照y從小到大排序
int cmpbyx(const void *left, const void *right);
//處理point[first]->point[final]射線左側的點
void dealwithleft(int first,int final,struct point point[max_size],int mark[max_size]);
int convexhull(void)
//start = gettickcount();
queryperformancecounter(&li);
start = li.quadpart;
//給陣列排序,按x從小到大
qsort(p, n, sizeof(struct point), cmpbyx);
mark[0] = 1;
mark[n-1] = 1;
//獲取convex陣列,存放所有結果頂點
dealwithleft(0,n - 1,p,mark); //處理point[0]->point[14]射線左邊的點
dealwithleft(n - 1,0,p,mark); //處理point[14]->point[0]射線右邊的點
//end = gettickcount();
// 獲取結束時間
queryperformancecounter(&li);
end = li.quadpart;
printf("結果集:\n");
j=0;
for(i=0;ix != rightpoint->x)
else
}//處理point[first]->point[final]射線左側的點
void dealwithleft(int first, int final, struct point point[max_size], int mark[max_size])
} }else
}} if(index!=-1) //取到point[index](即最高點) ,這個點與point[final]、point[first]構成的三角形面積最大
}
分治法 凸包問題
什麼是凸包?我的理解就是,圖形任意兩點的連線都沒有在圖形外部。問題 給定點集,怎麼求出凸包的邊界點呢?第一步 給這些點按照x的從大到小進行排序,如果x相同的按照y再排序。第二步 把x最小的和最大的連起來,他們必為凸包的邊界點。第三步 把平面區域分為兩個部分,分別在上面和下面去找面積最大的三角形 面積...
分治法解決凸包問題
問題 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,凸包問題是為集合s構造最小凸多邊形。思路設p1 x1,y1 p2 x2,y2 pn xn,yn 按照x軸座標公升序排列,則最左邊的點p1和最右邊的點p2一定是該集合的凸包頂點。如圖1所示。設p1pn是經過點p1...
凸包問題 (用分治演算法)
問題描述 在平面上有n個點,其中任何三個點都不在一條直線上,問如何尋找乙個點集,使得這些點構成的多邊形剛好能把所有點都包進。基本思想 我們採用分治演算法。首先算出這n個點的橫座標中位數,記為x0,畫出直線x x0,將整個平面分成兩部分。我們要做的就是分別求兩部分的凸包,最後再合併即可。利用分治和遞迴...