您的位置:首页 > 其它

poj 1408(计算几何)

2012-12-03 17:39 417 查看
1,求线段交点。

2,枚举各个面积

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

struct point
{
double x,y;
};
struct line
{
point a,b;
line(){}
line(point aa,point bb)
{
a=aa;
b=bb;
}
};

point intersection(line u,line v)
{
point ret=u.a;
double t=((u.a.x-v.a.x) * (v.a.y-v.b.y) -(u.a.y-v.a.y)*(v.a.x-v.b.x))/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x+=(u.b.x-u.a.x)*t;
ret.y+=(u.b.y-u.a.y)*t;
return ret;
}

double area_of_polygon(int n,point * p)
{
double s;
if(n<3) return 0;
s=p[0].y*(p[n-1].x-p[1].x);
for(int i=1;i<n;i++)
s+=p[i].y*(p[i-1].x-p[(i+1)%n].x);
return fabs(s/2);
}

double a[35],b[35],c[35],d[35];
int n;

int main()
{
while(scanf("%d",&n))
{
if(n==0) break;
a[0]=b[0]=c[0]=d[0]=0.0;
a[n+1]=b[n+1]=c[n+1]=d[n+1]=1.0;
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lf",&b[i]);
for(int i=1;i<=n;i++)
scanf("%lf",&c[i]);
for(int i=1;i<=n;i++)
scanf("%lf",&d[i]);
sort(a,a+n+1);
sort(b,b+n+1);
sort(c,c+n+1);
sort(d,d+n+1);
double ans=0;
point tmp[4];
point intsec[35][35];
for(int i=0;i<=n+1;i++)
{
point aa,bb;
aa.x=a[i];
aa.y=0;
bb.x=b[i];
bb.y=1;
line u=line(aa,bb);
//cout<<u.a.x<<" "<<u.a.y<<" "<<u.b.x<<" "<<u.b.y<<endl;
for(int j=0;j<=n+1;j++)
{
point cc,dd;
cc.x=0;
cc.y=c[j];
dd.x=1;
dd.y=d[j];
line v=line(cc,dd);
intsec[i][j]=intersection(u,v);
//cout<<intsec[i][j].x<<" "<<intsec[i][j].y<<endl;
}
}
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n+1;j++)
{
tmp[0]=intsec[i-1][j];
tmp[1]=intsec[i-1][j-1];
tmp[2]=intsec[i][j-1];
tmp[3]=intsec[i][j];
double t=area_of_polygon(4,tmp);
if(t>ans)
ans=t;
}
}
printf("%.6f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: