凸包定義:
點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法。
graham掃瞄法:
首先,找到所有點中最左邊的(y座標最小的),如果y座標相同,找x座標最小的.圖示:以這個點為基準求所有點的極角(atan2(y-y0,x-x0)),並按照極角對這些點排序,前述基準點在最前面,設這些點為p[0]..p[n-1].
ps:這樣預處理後,保證p[0],p[1]和p[n-1]都是凸包上的點.
建立乙個棧,初始時p[0]、p[1]、p[2]進棧,對於 p[3..n-1]的每個點,若棧頂的兩個點與它不構成」向左轉」的關係,則將棧頂的點出棧,直至沒有點需要出棧以後將當前點進棧;
所有點處理完之後棧中儲存的點就是凸包了。
題意:
求能讓乙個給出的圖形通過縫隙的最小寬度。題解:
用這些點構造乙個凸包,列舉凸包的各個邊,求凸包上其他點到這個邊的距離的最大值中的最小值。**:
#include
#include
#include
#include
#include
using
namespace
std ;
#define max 110
const
double eps = 1e-8 ;
int sgn(double x)
struct point
point(double _x , double _y)
point operator - (const point &b) const
double
operator ^ (const point &b) const
double
operator * (const point &b) const
};struct line
line(point _s , point _e)
};double xmult(point p0,point p1,point p2) //叉積p0p1 x p0p2
double dist(point a ,point b)
double pointtoline(point p ,line l)
point list[max] ;
int stack[max] , top ;
bool _cmp(point p1,point p2)
void anglesort(int n) //輸入,並把最左下方的點放在list[0],並且進行極角排序
}list[k]=list[0];
list[0]=p0;
sort(list+1,list+n,_cmp);
}void graham(int n)
}swap(list[k],list[0]);
sort(list+1,list+n,_cmp);
if(n == 1)
if(n == 2)
stack[0] = 0;
stack[1] = 1;
top = 2;
for(int i = 2;i < n;i++)
//for(int i = 0 ; i < top ; i ++) printf("%d\n" , stack[i]);
}double solve()
ans = min(ans , temp) ;
for(int i = 0 ; i < top - 1 ; i ++)
ans = min(ans , temp) ;
}return ans ;
}int main()
return
0 ;}
凸包(Graham掃瞄法構建)
ps 我的媽呀,心態 好像也不太難,看各種模板看的雲裡霧裡的,真的還是自己動手敲來的好,幾乎沒多久就懂的差不多了。乙個本該寒假就該掌握的知識,居然熬了我幾個小時。這一次還是很好的了解了凸包,以前看群裡學長們說,覺得好高大上,好難的樣子,仔細了解後發現其實也沒有想象中的那麼恐怖 凸包基本概念 這就是乙...
凸包問題 Graham掃瞄法
凸包點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。右圖中由紅色線段表示的多邊形就是點集q 的凸包。頂點個數n 1 排序 在點集q中找最左下方的點p0,就是x座標和y座標都最小的點,其餘的點計算它們的極座標幅角,以幅角的非降序順序來排序,如果有幅角...
尋找凸包的graham 掃瞄法
1,點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。2,凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法。3,graham掃瞄法 首先,找到所有點中最左邊的 y座標最小的 如果y座標相同,找x座標最小的.以這個點為基準求所有點的極角 ...