zoukankan      html  css  js  c++  java
  • 多边形面积(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
  • 相关阅读:
    数据结构与算法 ||设计模式
    前端页面知识点
    easyui的dialog中的输入框在关闭后如何清空输入框中的内容
    设计模式之单例模式(通俗易懂,超详细)
    分布式锁--Java1234
    spring cloud Alibaba
    easyui
    SQL查询最大或最新的一条数据
    java中的异常(exception、throw、throws、try···catch)
    git error: The following untracked working tree files would be overwritten by merge:
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10278635.html
Copyright © 2011-2022 走看看