覆蓋平面上n個點的最小凸多邊形
形象來講就是平面上有n個柱子,把一根封閉的彈性繩套上這些柱子,繩子繃緊以後形成的多邊形就是我們要求的凸包.
1.斜率逼近法,不好寫而且很慢,不予介紹。
2.jarvis演算法
3.graham演算法
第三個是基於對第二個的優化。
本文主要介紹jarvis演算法,graham演算法下篇文章再議。
找一條直線l過其中一點a,且其他點都在l的同側(這樣的直線顯然存在),則a為所求凸包的乙個點。
讓l以a為軸點向同乙個方向不斷選擇(預設順時針),直至l碰到除a以外的第乙個點,記為b。若同時碰到多個點b,則求距離最遠的。再以b為軸點旋轉,重複上述過程,直至找回到a點即求出了凸包,期間找到的點即為凸包上的點。
然而我們在計算機上並不可以實現直線的選擇,因此不可以直接套用數學構造法。但是我們可以通過掃瞄點來達到相同的目的。
#include
#include
#include
#include
const
double eps=1e-10;
int n;
struct point;}
};point d[100051];
int stk[100051];
double
operator * (point p1,point p2)
double distance(point p1,point p2)
bool judgeleft(point p0,point p1,point p2)//判斷同側
int main()
while(stk[top]!=fis);
top--;
printf("%d\n",top);
for(int i=1;i<=top;i++)
printf("%.2lf %.2lf\n",d[stk[i]].x,d[stk[i]].y);
return
0;}
凸包之Jarvis步進法
jarvis步進法 概述 也可稱為卷包裹法,思路是先找到乙個在凸包上的點,然後卷過去,由於每次確定凸包上的乙個點需要遍歷所有的點,因此時間複雜度為o n h 其中n為全部點的數目,h為凸包上的點數目 適用性 從時間複雜度可以看出此方法適用點的數目不易過多,建議適用graham掃瞄法 方法和步驟 下述...
平面凸包 學習筆記
什麼是平面凸包?平面凸包 以下簡稱 凸包 是指覆蓋平面上n個點的最小凸多邊形。形象來說就是把n個點看成n根柱子,用橡皮筋去緊框住這n根柱子,最後形成的拉緊的多邊形就是要求的凸包。怎麼求平面凸包?1.jarvis演算法 首先我們需要了解凸包的數學構造法 找一條直線l過其中一點 記為a 並且其他所有點都...
平面點集的凸包問題
平面點集的凸包可理解為包含所有點的最小凸多邊形 點可以在多邊形邊上或在其內 這裡給出一種求解方法。先找所有點中 y 座標最大最小的點pmax pmin,所找點必定是凸包上的點 找距離直線pmaxpmin兩側最遠的點p1,p0,構成初始三角形 再對每個三角形新生成的邊 和 繼續找與改變對應頂點 不在同...