poj 1408(计算几何)

1,求线段交点。

2,枚举各个面积

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 
  7 using namespace std;
  8 
  9 struct point
 10 {
 11     double x,y;
 12 };
 13 struct line
 14 {
 15     point a,b;
 16     line(){}
 17     line(point aa,point bb)
 18     {
 19         a=aa;
 20         b=bb;
 21     }
 22 };
 23 
 24 point intersection(line u,line v)
 25 {
 26     point ret=u.a;
 27     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));
 28     ret.x+=(u.b.x-u.a.x)*t;
 29     ret.y+=(u.b.y-u.a.y)*t;
 30     return ret;
 31 }
 32 
 33 double area_of_polygon(int n,point * p)
 34 {
 35     double s;
 36     if(n<3) return 0;
 37     s=p[0].y*(p[n-1].x-p[1].x);
 38     for(int i=1;i<n;i++)
 39         s+=p[i].y*(p[i-1].x-p[(i+1)%n].x);
 40     return fabs(s/2);
 41 }
 42 
 43 double a[35],b[35],c[35],d[35];
 44 int n;
 45 
 46 int main()
 47 {
 48     while(scanf("%d",&n))
 49     {
 50         if(n==0) break;
 51         a[0]=b[0]=c[0]=d[0]=0.0;
 52         a[n+1]=b[n+1]=c[n+1]=d[n+1]=1.0;
 53         for(int i=1;i<=n;i++)
 54             scanf("%lf",&a[i]);
 55         for(int i=1;i<=n;i++)
 56             scanf("%lf",&b[i]);
 57         for(int i=1;i<=n;i++)
 58             scanf("%lf",&c[i]);
 59         for(int i=1;i<=n;i++)
 60             scanf("%lf",&d[i]);
 61         sort(a,a+n+1);
 62         sort(b,b+n+1);
 63         sort(c,c+n+1);
 64         sort(d,d+n+1);
 65         double ans=0;
 66         point tmp[4];
 67         point intsec[35][35];
 68         for(int i=0;i<=n+1;i++)
 69         {
 70             point aa,bb;
 71             aa.x=a[i];
 72             aa.y=0;
 73             bb.x=b[i];
 74             bb.y=1;
 75             line u=line(aa,bb);
 76             //cout<<u.a.x<<" "<<u.a.y<<" "<<u.b.x<<" "<<u.b.y<<endl;
 77             for(int j=0;j<=n+1;j++)
 78             {
 79                 point cc,dd;
 80                 cc.x=0;
 81                 cc.y=c[j];
 82                 dd.x=1;
 83                 dd.y=d[j];
 84                 line v=line(cc,dd);
 85                 intsec[i][j]=intersection(u,v);
 86                 //cout<<intsec[i][j].x<<" "<<intsec[i][j].y<<endl;
 87             }
 88         }
 89         for(int i=1;i<=n+1;i++)
 90         {
 91             for(int j=1;j<=n+1;j++)
 92             {
 93                 tmp[0]=intsec[i-1][j];
 94                 tmp[1]=intsec[i-1][j-1];
 95                 tmp[2]=intsec[i][j-1];
 96                 tmp[3]=intsec[i][j];
 97                 double t=area_of_polygon(4,tmp);
 98                 if(t>ans)
 99                     ans=t;
100             }
101         }
102         printf("%.6f\n",ans);
103     }
104     return 0;
105 }
posted @ 2012-12-03 17:39  Missa  阅读(231)  评论(0编辑  收藏  举报