两直线交点 && 四边形面积 -- poj1408

/*
     **两直线交点 && 四边形面积** 
     http://poj.org/problem?id=1408
     题意:1*1的正方形上每条边上有n个点,每相互
     平行的边上,对应的第i个点相连,正方形会分割成多个
     四边形,求最大四边形的面积 
*/
#include 
#include 
struct node
{
    double x,y;
}point[35][35];
double max(double a, double b)
{
    return a > b ? a : b;
}
double xmult(node a,node b,node c)
{
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
void init(int n)
{
    //正方形角上的点也添加进去 
    point[0][0].x =0;
    point[0][0].y =0.0;
    point[0][n+1].x=1.0;
    point[0][n+1].y=0.0;
    point[n+1][0].x=0.0;
    point[n+1][0].y=1.0;
    point[n+1][n+1].x=1.0;
    point[n+1][n+1].y=1.0;
}
//求直线交点模板,ab在一条直线上,cd在一条直线上 
node intersection(node a,node b ,node c, node d)
{
    //就是联立方程组 
    node temp=a;
    double t=((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x));
    temp.x+=(b.x-a.x)*t;
    temp.y+=(b.y-a.y)*t;
    return temp;
}

int main()
{
    int n,i,j;
    while(scanf("%d",&n),n)
    {
        init(n);
        double maxarea=0.0,temp;
        for(i=1; i<=n; i++)
        {
            scanf("%lf",&point[0][i].x);
            point[0][i].y=0;
        }
        for(i=1; i<=n; i++)
        {
            scanf("%lf",&point[n+1][i].x);
            point[n+1][i].y=1;
        }
        for(i=1; i<=n; i++)
        {
            scanf("%lf",&point[i][0].y);
            point[i][0].x=0;
        }
        for(i=1; i<=n; i++)
        {
            scanf("%lf",&point[i][n+1].y);
            point[i][n+1].x=1.0;
        }
        for(j=1; j<=n; j++)
        {
            for(i=1; i<=n; i++)
            {
                //求所有的交点
                //前两个变量是垂直方向上的点,后两个参数是水平方向上的点 
                point[i][j]=intersection(point[0][j],point[n+1][j],point[i][0],point[i][n+1]);
            }
        }
        for(i=1; i<=n+1; i++)
        {
            for(j=1; j<=n+1; j++)
            {
                //求四边形面积的方法,以对角线对底,分割成两个三角形 
                temp=fabs(xmult(point[i-1][j-1],point[i][j],point[i][j-1]));
                temp+=fabs(xmult(point[i-1][j-1],point[i][j],point[i-1][j]));
                temp/=2;
                if(maxarea < temp)
                    maxarea = temp;
            }
        }
        printf("%.6f\n",maxarea);
    }
    return 0;
}

你可能感兴趣的:(两直线交点 && 四边形面积 -- poj1408)