zoukankan      html  css  js  c++  java
  • 两条线段求交点+叉积求面积 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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    汇编指令:ldr和str,ldm和stm的区别
    面向对象(成员(变量,方法,属性)组合并嵌套)
    面向对象三大特性编写面向对象程序,self到底是谁
    内置函数二. 递归 二分法
    内置函数
    生成器;三元表达式, 推导式
    函数名的应用,闭包,迭代器
    函数的进阶
    闭包,迭代器
    函数
  • 原文地址:https://www.cnblogs.com/6262369sss/p/9443155.html
Copyright © 2011-2022 走看看