在二維空間中,凸包可以簡單的認為是最小的包含所有點的凸多邊形。
簡單的卷包裹法:尋找最邊緣(最下方的,次之是最左邊的;或者最左邊的,次之最下邊)點。假想用一根繩子向右逆時針旋轉碰到另乙個點,這樣新找到的點作為端點,繼續旋轉繩子重複找點的步驟,一直圍成乙個凸多邊形。時間複雜度:o(n^2) //我把此**和graham-scan比較了一下,沒有理解為什麼他就是 o(n^2) t_t
(如果在尋找的射線上有多個點的情況,使用和保留離前端點最遠的那一點)
因為涉及到旋轉和夾角,所以運用到了叉積。
例子:hdu 1348 wall
大致題意:給出n個點,它所形成的多邊形向外撐長l,新的多邊形的周長是多少?
分析:每對對頂角的和是180度,n多邊形有n個頂點,同時多邊形的內角和是180(n-2),那麼外圍的夾角和就應該是180n-180(n-2)=360
於是得到結論:多邊形的周長+圓的周長就是所求。
#include #include #include #include using namespace std;
struct pointpt[1005];
int sta[1005],ans[1005],cnt;
int cmp(point a,point b)
sta[top++]=i;
}for(int i=0;i=0;i--)
sta[top++]=i;
}for(int i=0;i>t;
while(t--)pt[1005],ans[1005];
int cnt;
int cmp(point a,point b)
ans[cnt++]=pt[i];
}int key=cnt;
//求上凸包 (將pt[n-1]和pt[0]連線起來。)
for(int i=n-2;i>=0;i--)
ans[cnt++]=pt[i];
}}int main()
convex(n);
double res=2*pi*l;
for(int i=0;i
printf("%.0lf\n",res);
if(t) puts("");
}return 0;
}
凸包問題之GrahamScan法
grahamscan法 當沿著convex hull逆時針漫遊時,總是向左轉 在極座標系下按照極角大小排列,然後逆時針方向漫遊點集,去除非conves hull頂點 非左轉點 實現 如下 include include include define max size 10001 struct poi...
凸包之Jarvis步進法
jarvis步進法 概述 也可稱為卷包裹法,思路是先找到乙個在凸包上的點,然後卷過去,由於每次確定凸包上的乙個點需要遍歷所有的點,因此時間複雜度為o n h 其中n為全部點的數目,h為凸包上的點數目 適用性 從時間複雜度可以看出此方法適用點的數目不易過多,建議適用graham掃瞄法 方法和步驟 下述...
BZOJ1209 最佳包裹 (三維凸包 增量法)
求三維凸包的表面積。n 100 n le100 n 100 暴力往當前的凸包裡加點。o n 2 o n 2 o n2 題解詳見大佬部落格 擾動函式sha keshake shak e是為了避免四點共面。實測e ps epsep s開到1e 101e 10 1e 10才過 include using ...