两条线段求交点+叉积求面积 poj 1408

题目链接:https://vjudge.net/problem/POJ-1408

题目是叫我们求出所有四边形里最大的那个的面积。

思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两两相交的所有交点,如果不会求两条线段之间的交点的话可以看一下这个博客:https://www.cnblogs.com/elpsycongroo/p/8726513.html

然后再求每一个四边形的面积,要求某个四边形的面积的话,可以先确定四个点中的一个点,这样其他三个点就随之确定了,在这里应该是先确定左下角的点比较方便,得到四个点坐标之后就可以把一个四边形切割成两个三角形,用叉积求三角形面积,然后两个三角形面积相加就是四边形面积了。

我的代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<cstdio>
using namespace std;
#define eps 1e-8
#define ll long long
#define INF 0x3f3f3f3f
double a[35],b[35],c[35],d[35];
int n,m,cnt;
struct point{
    double x,y;
}p[35][35];
double ans;
void read()
{
    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]);
    a[0]=b[0]=0;        //四个角上的点的横纵坐标 
    a[n+1]=b[n+1]=1;
    c[0]=d[0]=0;
    c[n+1]=d[n+1]=1;
}
point cal(double x1,double x2,double y1,double y2)//求交点的函数 
{
    double a1=1,b1=x1-x2,c1=-x1;
    double a2=y2-y1,b2=-1,c2=y1;
    double D=a1*b2-a2*b1;
    point ans;
    ans.x=(b1*c2-b2*c1)/D;
    ans.y=(a2*c1-a1*c2)/D;
    return ans;
}
void get_point()
{
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
            p[i][j]=cal(a[i],b[i],c[j],d[j]);
        }
    }
}
double cross(point a,point b,point c)//叉积 
{
    return fabs((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x));
}
void get_area()
{
    for(int i=0;i<n+1;i++)
    {
        for(int j=0;j<n+1;j++)
        {
            double area=0;
            area+=cross(p[i][j],p[i][j+1],p[i+1][j])/2.0;
            area+=cross(p[i+1][j+1],p[i][j+1],p[i+1][j])/2.0;
            ans=max(area,ans);
        }
    }
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        read();    //输入 
        cnt=0;
        get_point();//求交点 
        ans=0;
        get_area();//求面积 
        printf("%.6f\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/6262369sss/p/9443155.html