Cows poj 3348 (凸包+多边形面积)
程序员文章站
2024-03-16 19:50:52
...
Cows poj 3348
分类:凸包+多边形面积
题意:给出点的位置,求最大面积。答案除以50(emmm我求出最大面积然后和答案一直不一样,后来发现。。。忘记除以50了)
思路:运用了Graham_Scan 算法和求多边形面积公式。
AC代码:
//例题;Graham算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10010;
struct point{
double x,y;
bool operator <(const point &u)const{
if(y==u.y) return x<u.x;
return y<u.y;
}
}p[N];//存储
int res[N],top;
bool mult(point sp,point ep,point op)
{
return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);
}
void Graham(int n)
{
int len;
top=1;
sort(p,p+n);
if(n==0) return;res[0]=0;
if(n==1) return;res[1]=1;
if(n==2) return;res[2]=2;
for(int i=2;i<n;i++){
while(top&&mult(p[i],p[res[top]],p[res[top-1]])) top--;
res[++top]=i;
}
len=top;
res[++top]=n-2;
for(int i=n-3;i>=0;i--){
while(top!=len&&mult(p[i],p[res[top]],p[res[top-1]])) top--;
res[++top]=i;
}
}
//多边形面积求解,也可以用三角形的方式
struct Tpoint
{
double x,y;
Tpoint(){}
Tpoint(double _x,double _y){x=_x;y=_y;}
Tpoint operator -(Tpoint &b)const {
return Tpoint(x-b.x,y-b.y);
}
}ans[N];
double cross(Tpoint A,Tpoint B)//三角形面积
{
//return fabs((B.x-A.x)*(C.x-A.y)-(C.x-A.x)*(B.y-A.y))/2;
return A.x*B.y-A.y*B.x;
}
double poly_are(int n)
{
double tmp=0.00;
for(int i=1;i<n-1;i++)
tmp+=cross(ans[i]-ans[0],ans[i+1]-ans[0]);
return fabs(tmp)/100.0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int s,i,cnt=0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
if(n<3)
{
printf("0\n");
continue;
}
Graham(n);
for(s=0;s<top;s++)
if(!p[res[s]].x&&!p[res[s]].y) break;
for(i=s;i<top;i++)
ans[cnt++]=Tpoint(p[res[i]].x,p[res[i]].y);//,printf(" %lf %lf \n",p[res[i]].x,p[res[i]].y);
for(i=0;i<s;i++)
ans[cnt++]=Tpoint(p[res[i]].x,p[res[i]].y);//,printf(" %lf %lf \n",p[res[i]].x,p[res[i]].y);
double out=poly_are(cnt);
printf("%d\n",(int)out);
}
return 0;
}
上一篇: 利用JNA实现透明(图片透明,自定义不规则多边形透明)
下一篇: 绘制多边形并进行拉伸