凸包(Convex Hull)是一個計算幾何(圖形學)中的概念。
在一個實數向量空間V中,對於給定集合X,所有包含X的凸集的交集S被稱爲X的凸包。
X的凸包可以用X內所有點(X1,...Xn)的線性組合來構造.
在二維歐幾里得空間中,凸包可想象爲一條剛好包著所有點的橡皮圈。
用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連接起來構成的凸多邊型,它能包含點集中所有的點。
給我們n個點,讓我們找出這個凸包外面一圈經過的節點。
graham旋轉掃描就是來解決這個問題的。
題目大意:且凸包的邊的長度
#include<cstdio>
#include<iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
struct point{
int x,y;
double angle;
}s[100010];
bool cmp2(point a,point b){
return a.angle<b.angle;
}
int chch(point a,point b,point c){
point x1,x2;
x1.x=b.x-a.x,x1.y=b.y-a.y;
x2.x=c.x-b.x,x2.y=c.y-b.y;
return x1.x*x2.y-x1.y*x2.x;
}
point tubao[100010];
int main()
{
cin>>n;
int t=1;
for(int i=1;i<=n;i++){
cin>>s[i].x>>s[i].y;
if(s[i].y<s[t].y)t=i;
else if(s[i].y==s[t].y&&s[i].x<s[t].x)t=i;
}
swap(s[n],s[t]);
for(int i=1;i<n;i++){
if(s[i].x-s[n].x==0)s[i].angle=3.1415926/2;
else s[i].angle=atan2( (s[i].y-s[n].y),(s[i].x-s[n].x) );
}
sort(s+1,s+n,cmp2);
t=1;
tubao[1]=s[n];
for(int i=1;i<n;i++){
while((t>1)&&(chch(tubao[t-1],tubao[t],s[i])<=0))t--;
t++;
tubao[t]=s[i];
}
double ans=0;
for(int i=1;i<=t;i++){
int b=i+1;
if(i==t)b=1;
ans+=pow(pow((tubao[i].x-tubao[b].x)*1.0,2)+pow((tubao[i].y-tubao[b].y)*1.0,2),1.0/2);
}
printf("%.1f",ans);
return 0;
}