精华内容
下载资源
问答
  • 计算凸多边形面积

    2014-10-27 13:41:46
    凸多边形面积 【问题描述】 给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积. 输入数据表示了如图所示的四边形。其面积为5.00。 评分标准: 本程序允许使用数学库函数,如果你的输出与标准...
  • 利用测地坐标计算椭球面上凸多边形面积的算法研究,施一民,朱紫阳 ,本文推导出用三顶点的测地坐标计算地球椭球面上三角形面积的公式,公式表明,其主项的表示式与按平面坐标求面积的计算式完全一致
  • 任意多边形的面积计算_拾忆楓灵的博客-CSDN博客​blog.csdn.net计算任意多边形的面积 - tenos - 博客园​www.cnblogs.com完美解决计算3D空间任意多边形面积_Studiouss的博客-CSDN博客​blog.csdn.net求多边形面积...
    任意多边形的面积计算_拾忆楓灵的博客-CSDN博客blog.csdn.net
    d4f97ad827f3ea5836daac5a65221632.png
    计算任意多边形的面积 - tenos - 博客园www.cnblogs.com
    dfa3dfa78df34136e682414f9beef9f0.png
    完美解决计算3D空间任意多边形面积_Studiouss的博客-CSDN博客blog.csdn.net
    0504419c8545f6979ffdfc3e7fcaf09e.png
    求多边形面积公式(已知顶点坐标)_扬帆起航-CSDN博客blog.csdn.net
    1e7a94f0f546655417ffd79b788cbf91.png

    任意给出一个三角形ΔABC,设其顶点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3),那么根据线性代数的知识,ΔABC的有向面积可表示为:

    cec5632df1fd72a5fbd6c7486bb5ff55.png

    其中,ΔABC顶点A、B、C逆时针给出时有向面积为正,顺时针给出时有向面积为负。如图1所示,S∆ABC>0、S∆ABD<0.

    7b449f0bd3520e9573d1dcba18c5a8a2.png

    图1

    我们知道任意的多边形都可以分割成多个三角形,根据以上三角形面积公式就可以求出任意多边形的面积。如图2所示的六边形顶点坐标分别为O(x0, y0),A(x1, y1),B(x2, y2),C(x3, y3),D(x4, y4),E(x5, y5),则其面积可以表示为四个三角形面积之和:S=S∆OAB+S∆OBC+S∆OCD+S∆ODE

    其中:

    a82b6b6844247b74a41ead876f34d005.png

    所以

    6029015224ad6843e29b1074f1f21f52.png

    9317e3fdb19f62726309b9aead583e50.png

    451de08e6720a9d8eae9c5d3c79b147b.png

    图2

    在这里,前文给出的多边形示例是一个凸多边形,那么这一结论适用于凹多边形吗?下面我们看看如图3所示的凹多边形。

    e1421b54ff2b07b6f8262b3dcb09f330.png

    图3

    按照上面的思路,这里的凹多边形面积表示为:S=S∆OAB+S∆OBC+S∆OCD,从前面介绍可以知道

    S∆OAB=-S∆OBA<0,所以很明显上式是成立的,即此公式也适用于凹多边形。

    经过以上分析,给出任意一个多边形,其顶点坐标依次为(x0,y0),(x1,y1),(x2,y2),...,(xn,yn)(其中n=2,3,4,…),则其面积可表示为:

    d713465e86fe2fde4c07755403896392.png

    换句话说,若已知多边形边上的每一点坐标,我们就可以求出该多边形的面积,包括如图4所示的曲线图形,当从O点到A点到O点的曲线上每一点坐标都已知时就能求出该曲线图的面积。

    25e7cb87baed1b39bd03b816ee9970dd.png

    图4

    struct Point2d
    {
        double x;
        double y;
        Point2d(double xx, double yy): x(xx), y(yy){}
    };
     
    //计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列
    double ComputePolygonArea(const vector<Point2d> &points)
    {
        int point_num = points.size();
        if(point_num < 3)return 0.0;
        double s = 0;
        for(int i = 0; i < point_num; ++i)
            s += points[i].x * points[(i+1)%point_num].y - points[i].y * points[(i+1)%point_num].x;
        return fabs(s/2.0);
    }
    

    或者:

    struct Point2d
    {
        double x;
        double y;
        Point2d(double xx, double yy): x(xx), y(yy){}
    };
     
    //计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列
    double ComputePolygonArea(const vector<Point2d> &points)
    {
        int point_num = points.size();
        if(point_num < 3)return 0.0;
        double s = points[0].y * (points[point_num-1].x - points[1].x);
        for(int i = 1; i < point_num; ++i)
            s += points[i].y * (points[i-1].x - points[(i+1)%point_num].x);
        return fabs(s/2.0);
    }

    或者:

    <script>
        function square(x,y) {
    //数组x,y分别按顺序存储各点的横、纵坐标值
            var sum0=0;
            for (var i = 0; i < x.length - 1; i++) {
                sum0 += (x[i] * y[i + 1] - x[i + 1] * y[i]);
            }
            var square = (Math.abs(sum0 + (x[i] * y[0]) - (x[0] * y[i]))) / 2;
            return square;
        }
    </script>
    展开全文
  • 5-3 凸多边形面积

    2020-03-23 21:25:44
    给出平面上一组顶点的坐标,计算出它们所围成的凸多边形面积。 【输入形式】 从标准输入读取顶点坐标。格式为:第一行是点的个数N(3≤N≤15),后面紧接着N行,每行两个数字 (由空格隔开),分别表示该点的X、Y...

    【问题描述】
    给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积。
    【输入形式】
    从标准输入读取顶点坐标。格式为:第一行是点的个数N(3≤N≤15),后面紧接着N行,每行两个数字 (由空格隔开),分别表示该点的X、Y坐标(0≤X,Y≤32767)。所有点的坐标互不相同,且按顺时针次序给出。
    输入数据确保该多边形是一个凸多边形。
    【输出形式】
    向标准输出打印一个浮点数,是该多边形的面积。该浮点数保留两位小数。
    【输入样例】
    4
    3 3
    3 0
    1 0
    1 2
    【输出样例】
    5.00
    【样例说明】输入数据表示了如图所示的四边形。其面积为5.00。
    题目分析:
    在这里插入图片描述

    • 自作答案:
    //北航机试2020/3/23
    
    #include<stdio.h>
    #include<math.h>
    
    struct Point
    {
        double x,y;
    }points[100];
    
    int N;
    
    double get_distance(Point a,Point b)
    {
        double t = (a.x-b.x)*(a.x-b.x);
        double t1 = (a.y-b.y)*(a.y-b.y);
        return sqrt(t+t1);
    }
    
    double get_area(Point a,Point b,Point c)
    {
        double d1 = get_distance(a,b);
        double d2 = get_distance(a,c);
        double d3 = get_distance(b,c);
        double p =(d1 + d2 + d3)/2;
        return sqrt(p*(p-d1)*(p-d2)*(p-d3));
    }
    
    double sum_area = 0;
    int main()
    {
        int i,j;
        scanf("%d",&N);
        for(i = 0;i<N;i++)
        {
            scanf("%lf%lf",&points[i].x,&points[i].y);
        }
    
        for(i = 1;i<=N-2;i++)
        {
            sum_area += get_area(points[0],points[i],points[i+1]);
        }
        printf("%.2lf\n",sum_area);
        return 0;
    }
    
    
    展开全文
  • 凸多边形面积应用

    2019-01-05 12:53:39
    Rabbit和xxx获得了一个很大的蛋糕,这个蛋糕实际上是由N个点组成的凸多边形(点从1到N编号,保证没有三点共线)。 接着两个人开始分蛋糕,他们准备沿着蛋糕上两点连成的直线把蛋糕切成两份,由于Rabbit是女生,xxx总会...

    链接:https://ac.nowcoder.com/acm/contest/328/F
    来源:牛客网
     

    题目描述

    Rabbit和xxx获得了一个很大的蛋糕,这个蛋糕实际上是由N个点组成的凸多边形(点从1到N编号,保证没有三点共线)。
    接着两个人开始分蛋糕,他们准备沿着蛋糕上两点连成的直线把蛋糕切成两份,由于Rabbit是女生,xxx总会把大的那一份分给Rabbit。现在有Q种切的方案,xxx可以选择任意一种,问xxx最多能分得多少蛋糕? 

    输入描述:

    
     

    第一行两个整数N,Q。

    接下来N行,每行两个数xi,yi表示第i个点的坐标(点按逆时针顺序给出)。

    接下来Q行,每行两个整数S,T表示切的两个点。

    输出描述:

    输出xxx最多能分得多少面积的蛋糕。

    示例1

    输入

    复制

    4 2
    0.5 0.5
    10.5 0.5
    10.5 10.5
    0.5 10.5
    1 3
    4 2

    输出

    复制

    50.00

    备注:

    
     

    3<=n<=105

    1<=q<=105

    −105<=xi,yi<=105

    1<=S,T<=N,S!=T

    本题采用special judge,假设你的答案为a,标程答案为b,如果满足|a−b|max(1,|b|)≤10−4|a−b|max(1,|b|)≤10−4,则认为是正确的

     

    多边形面积显然很好求,就是邻边叉积之和/2。

    代码;
     

    #include<bits/stdc++.h>
    #define db double
    using namespace std;
    const int maxn=1e5+10;
    db x[maxn],y[maxn],sum1[maxn],sum2[maxn],ans;
    int main()
    {
        int n,q,s,t;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++)
        scanf("%lf%lf",&x[i],&y[i]);
      
        y[n+1]=y[1],x[n+1]=x[1];
        for(int i=1;i<=n;i++)
        {
            sum1[i]=sum1[i-1]+x[i]*y[i+1];
            sum2[i]=sum2[i-1]+y[i]*x[i+1];
        }
        db S=(sum1[n]-sum2[n])/2;
        while(q--)
        {
            scanf("%d%d",&s,&t);
            if(s>t)swap(s,t);
            db t1=sum1[t-1]-sum1[s-1]+x[t]*y[s];
            db t2=sum2[t-1]-sum2[s-1]+y[t]*x[s];
            db tmp=(t1-t2)/2;
            ans=max(ans,min(tmp,S-tmp));
        }
        printf("%.2lf\n",ans);
    }

     

    展开全文
  • 题面 题意:有一个凸多边形岛屿,然后告诉你...题解:算出来岛屿落地位置,再利用圆与凸多边形面积交 1 #include<bits/stdc++.h> 2 #define inf 1000000000000 3 #define M 100009 4 #define eps 1e-12...

    题面

    题意:有一个凸多边形岛屿,然后告诉你从高空(x,y,h)投下炸弹,爆炸半径r,飞机水平速度和重力加速度,问岛屿被炸了多少

    题解:算出来岛屿落地位置,再利用圆与凸多边形面积交

     1 #include<bits/stdc++.h>
     2 #define inf 1000000000000
     3 #define M 100009
     4 #define eps 1e-12
     5 #define PI acos(-1.0)
     6 using namespace std;
     7 struct Point
     8 {
     9     double x,y;
    10     Point(){}
    11     Point(double xx,double yy){x=xx;y=yy;}
    12     Point operator -(Point s){return Point(x-s.x,y-s.y);}
    13     Point operator +(Point s){return Point(x+s.x,y+s.y);}
    14     double operator *(Point s){return x*s.x+y*s.y;}
    15     double operator ^(Point s){return x*s.y-y*s.x;}
    16 }p[M];
    17 double max(double a,double b){return a>b?a:b;}
    18 double min(double a,double b){return a<b?a:b;}
    19 double len(Point a){return sqrt(a*a);}
    20 double dis(Point a,Point b){return len(b-a);}//两点之间的距离
    21 double cross(Point a,Point b,Point c)//叉乘
    22 {
    23     return (b-a)^(c-a);
    24 }
    25 double dot(Point a,Point b,Point c)//点乘 
    26 {
    27     return (b-a)*(c-a);
    28 }
    29 int judge(Point a,Point b,Point c)//判断c是否在ab线段上(前提是c在直线ab上)
    30 {
    31     if (c.x>=min(a.x,b.x)
    32        &&c.x<=max(a.x,b.x)
    33        &&c.y>=min(a.y,b.y)
    34        &&c.y<=max(a.y,b.y)) return 1;
    35     return 0;
    36 }
    37 double area(Point b,Point c,double r)
    38 {
    39     Point a(0.0,0.0);
    40     if(dis(b,c)<eps) return 0.0;
    41     double h=fabs(cross(a,b,c))/dis(b,c);
    42     if(dis(a,b)>r-eps&&dis(a,c)>r-eps)//两个端点都在圆的外面则分为两种情况
    43     {
    44         double angle=acos(dot(a,b,c)/dis(a,b)/dis(a,c));
    45         if(h>r-eps) return 0.5*r*r*angle;else 
    46         if(dot(b,a,c)>0&&dot(c,a,b)>0)
    47         {
    48             double angle1=2*acos(h/r);
    49             return 0.5*r*r*fabs(angle-angle1)+0.5*r*r*sin(angle1);
    50         }else return 0.5*r*r*angle;
    51     }else 
    52         if(dis(a,b)<r+eps&&dis(a,c)<r+eps) return 0.5*fabs(cross(a,b,c));//两个端点都在圆内的情况
    53         else//一个端点在圆上一个端点在圆内的情况
    54         {
    55             if(dis(a,b)>dis(a,c)) swap(b,c);//默认b在圆内
    56             if(fabs(dis(a,b))<eps) return 0.0;//ab距离为0直接返回0
    57             if(dot(b,a,c)<eps)
    58             {
    59                 double angle1=acos(h/dis(a,b));
    60                 double angle2=acos(h/r)-angle1;
    61                 double angle3=acos(h/dis(a,c))-acos(h/r);
    62                 return 0.5*dis(a,b)*r*sin(angle2)+0.5*r*r*angle3;
    63             }else
    64             {
    65                 double angle1=acos(h/dis(a,b));
    66                 double angle2=acos(h/r);
    67                 double angle3=acos(h/dis(a,c))-angle2;
    68                 return 0.5*r*dis(a,b)*sin(angle1+angle2)+0.5*r*r*angle3;
    69             }
    70         }
    71 }
    72 int main()
    73 {
    74     double x,y,h,x1,y1,R;
    75     while(scanf("%lf%lf%lf",&x,&y,&h)!=-1)
    76     {
    77         scanf("%lf%lf%lf",&x1,&y1,&R);
    78         int n;
    79         scanf("%d",&n);
    80         for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
    81         p[n+1]=p[1];
    82         double V=sqrt(2*10*h);
    83         double t0=V/10;
    84         double x0=x+x1*t0;
    85         double y0=y+y1*t0;
    86         Point O(x0,y0);
    87         for(int i=1;i<=n+1;i++) p[i]=p[i]-O;
    88         O=Point(0,0);
    89         double sum=0;
    90         for(int i=1;i<=n;i++)
    91         {
    92             int j=i+1;
    93             double s=area(p[i],p[j],R);
    94             if(cross(O,p[i],p[j])>0) sum+=s; else sum-=s;
    95         }
    96         printf("%.2lf\n",fabs(sum));
    97     }
    98     return 0;
    99 }

     

    转载于:https://www.cnblogs.com/qywhy/p/9772742.html

    展开全文
  • 求任意凸多边形面积

    2020-01-27 21:12:50
    任意给出一个三角形ΔABC...给出任意一个多边形,其顶点坐标依次为(x0,y0),(x1,y1),(x2,y2),…,(xn,yn)(其中n=2,3,4,…),则其面积可表示为: 故计算的函数为: double any_ploygon_area(int x,int ...
  •  可以将凸多边形(边数n > 3)划分为 (n - 2) 个三角形,分别运用向量叉积计算每个三角形的面积,最后累加各个三角形的面积就是多边形的面积。 2. 求多边形面积的算法模板:  定义点的结构体 struct Point...
  • bzoj2618凸多边形面积

    千次阅读 2016-03-22 10:08:08
    题意是要求n个凸多边形(逆时针给定点)的面积并,数据很弱。 把每个多边形拆成直线,然后扫一遍做半平面交,最后统计答案就可以了: #include #include #include #include #include #include #i
  • 求把这n个点围起来的凸多边形面积,然后除以50。 思路:凸包裸题,凸包不严格的说就是把所有点围起来的凸多边形。怎么求呢?按最左下的点进行极角排序,然后把凸包中的点放进栈中。每次要放点时,判断一下是不是...
  • * polygon.c // gcc polygon.c -Wall -lm #include <stdio.h> #include <stdlib.h> #include <math.h> #ifndef null #define null ((void *)0) #endif typedef struct { ... float y...
  • 然后问你最后的凸多边形面积,并且这些操作最后都是要收尾的。用向量来算面积。 #include #include #include #include #include #include #include #include #include #include #include #inc
  • 题意:给你一个n凸多边形顶点的坐标,从其中任选k个点组成k多边形,问k多边形面积的期望; 分析:可以提前用long double预处理出组合数,方便后面计算,多边形面积时顺时针或逆时针相邻顶点叉积和; #include<...
  • 有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们包起来,并计算出木板占整个包装面 积的百分比 【输入格式】 输入第一行为数据组数T(T≤50)。每组数据第一行为木板个数n(2≤n≤600)。以下n行每行5个...
  • 那么多边形重心就是若干个三角形的重心带权求中心,可以用质点质心公式。 #include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <cstring>...
  • 题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1812解法:套多边交模板。#include using namespace std; const int maxn = 555; const int maxsin = 10; const double eps = 1e-8; const double...
  • 共回答了27个问题采纳率:85.2%试试我编的这个程序....这个程序对任意多边形都有效,包括凸多边形.程序中的圆形圆心在(-1,2)半径r=1. 这些参数可以任意改.网格点越多越精确,计算量也越大.想要更加严格的完成这个计算,...
  • 网上搜索到的,非常简单,还没有搞明白为什么结果会是正确的。顺便挣点小分
  • E - Cows   POJ - 3348  Your friend to the south is interested in building fences and turning plowshares into swords....三角形面积,就是叉积的一半,叉积求的是平行四边形面积。  
  • 两个小朋友分蛋糕,一个小朋友切蛋糕,另一个小朋友先挑蛋糕。给出四边形蛋糕的坐标。如图,蛋糕只能在顶点和中点处切开。两块蛋糕尽量一样大,求面积
  • 在本题中,假设清水河校区是一个凸多边形,水渠是一条直线,要求给出清水河校区被水渠分割成的两部分的面积。     Input 输入包含多组数据。每组数据第一行是一个整数N(3),表示清水河...
  • Description “ 改革春风吹满地,  不会AC没关系;  实在不行回老家,  ...话说部分学生心态极好,每天就知道游戏,这次考试如此简单的...这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是
  • 弓形面积 167 { 168 double res; 169 double cc=dot(o,s,t)/getlen(s)/getlen(t); // 夹角的余弦值,不能用正弦 asin的范围是[-π/2, π/2] acos的范围是[0, π] 170 cc= acos(cc); ...
  • 传送门 题意: 问得分的期望。 #include #include #include #include #include #include #include #include #include #define REP(i, a, b) for (int i = (a), _end_ = (b);...#define debug
  • 是将顶点为n的凸多边形划分为n-2个三角形,在用叉积求三角形面积,最后累加和然后输出。  我的求多边形面积模板: 1 const int MAXPOINT = 105 ; 2 struct Point{ // 定义点结构 3 ...
  • Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地。 谢谢!...这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 710
精华内容 284
关键字:

凸多边形面积