• 多边形面积(Area_Of_Polygons)


    原理:

    任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。

    分析: 
    由于给出的点是相对于我们的坐标原点的坐标,每个点实际上我们可以当作一个顶点相对于原点的向量,如下图所示: 


     
    P(0,0)对应的顶点向量分别为:A(x0,y0),B(x1,y1),…,G(x6,y6) 
    另外,△PAB△PAB的矢量面积即为


    且多边形面积为:


    根据上述公式可以直接求出多边形的代码从而避免了边长的复杂计算。

     例题:

    https://ac.nowcoder.com/acm/contest/328/F

    题解:计算几何裸题

    #include <bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<bitset>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<list>
    #include<map>
    #include<set>
    //#define DEBUG
    #define RI register int
    using namespace std;
    typedef long long ll;
    //typedef __int128 lll;
    const int N=100000+10;
    const int MOD=1e9+7;
    const double PI = acos(-1.0);
    const double EXP = 1E-8;
    const int INF = 0x3f3f3f3f;
    int t,n,m,k,q;
    double ans;
    struct node{
        double x,y;
     
     
    }e[N];
    double a[N];
    char str;
    int main()
    {
    #ifdef DEBUG
        freopen("input.in", "r", stdin);
        //freopen("output.out", "w", stdout);
    #endif
        scanf("%d%d",&n,&q);
        if(n==3){
            printf("%.6f",ans);
            return 0;
        }
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&e[i].x,&e[i].y);
        }
        for(int i=1;i<=n;i++){
            if(n==1)
            a[i]=a[i-1]+e[i].y*e[n].x-e[i].x*e[n].y;
            else
            a[i]=a[i-1]+e[i].y*e[i-1].x-e[i].x*e[i-1].y;
        }
        double sum=fabs(a[n]/2);
        //cout<<sum<<endl;
        int s,t;
        while(q--){
            scanf("%d%d",&s,&t);
     
            if(s>t)
                swap(s,t);
            if(abs(s-t)==1||s==1&&t==n)
                continue;
            double sumtmp=fabs((a[t]-a[s]+e[s].y*e[t].x-e[s].x*e[t].y)/2);
            ans=max(ans,min(sumtmp,sum-sumtmp));
        }
        printf("%.6f",ans);
        //cout << "Hello world!" << endl;
        return 0;
    }
    View Code

    C++版本二

    题解:

    计算几何
    只要叉积维护一下前缀和就好了。

    #include <cstdio>
    #include <bits/stdc++.h>
    #include <map>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define mst(a,b) memset((a),(b),sizeof(a))
    #define rush() int T;scanf("%d",&T);while(T--)
     
    typedef long long ll;
    const int maxn = 200005;
    const ll INF = 1e18;
    const ll mod=1e9+7;
    const double eps = 1e-9;
     
    int n,m;
     
    struct node
    {
        double x,y;
    }a[maxn];
     
    double sum[maxn];
     
    double cross(node a,node b,node c)
    {
        return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
    }
     
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&a[i].x,&a[i].y);
        }
        node zero;
        zero.x=0;
        zero.y=0;
        for(int i=1;i<=n;i++)
        {
            double ans=cross(zero,a[i],a[(i==n?1:i+1)]);
            sum[i]=sum[i-1]+ans;
        }
        for(int i=n+1;i<=2*n;i++)
        {
            sum[i]=sum[i-1]+sum[i-n];
        }
        double Sum=fabs(sum[n])/2.0;
        double cnt=0;
        for(int i=0;i<m;i++)
        {
            int ss,tt;
            scanf("%d%d",&ss,&tt);
            if(ss>tt) swap(ss,tt);
            double ans=sum[tt-1]-sum[ss-1];
            ans+=cross(zero,a[tt],a[ss]);
            ans=fabs(ans)/2.0;
            cnt=max(cnt,min(ans,Sum-ans));
        }
        printf("%.15f
    ",cnt);
    }
    View Code
  • 相关阅读:
    转载:navicat乱码怎么解决
    mysql8.0设置简单密码报错ERROR : Your password does not satisfy the current policy requirements
    mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法
    转载:Mongodb启动报错:about to fork child process, waiting until server is ready for connections.
    Ubuntu下mongodb的安装与使用
    IDEA使用Maven自动导入依赖不成功,手动操作导入依赖
    Maven自动更新依赖而不是reload project
    解决Spring Boot Application in default package
    转载:pom文件的 spring-boot-maven-plugin报红
    转载:启动springboot报错:程序包org.springframework.boot不存在--详解
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10278635.html
Copyright © 2020-2023  润新知