多边形面积

多边形面积

多边形通常分为凸多边形凹多边形

计算多边形面积有几种好用的算法

其核心思想都是把一个n(n>=3)边形转化为n-2个三角形,然后计算

一:海伦公式

最常见的多边形面积计算公式

此公式表达式为:

S= sqrt( p*(p-a)*(p-b)*(p-c))

其中p为此三角形的半周长,而a,b,c为三角形三边长

若三角形三点为x1,y1,x2,y2,x3,y3,

即p=(a+b+c)/2

a=sqrt((x2-x1)2+(y2-y1)2)

b=sqrt((x3-x2)2+(y3-y2)2)

c=sqrt((x3-x1)2+(y3-y1)2)

可能海伦公式就是 的一个变形而已。。。所以觉得意义也是等价的。。。

然后,我们再来进一步思考,这个东西和内心的关系:

对三角形的内切圆来说,如前面 白如冰所说会很自然联想到内切圆:

如此,我们发现,内切圆的半径实际上可以被 半周长 和 a,b,c表示了。
缺点:适用于边数很小的情况,一旦边数增多,计算繁琐,损失精度

C++代码:

 1 typedef struct
 2 {
 3     int x;
 4     int y;
 5 }Point;
 6 Point point[N];
 7 int Area(point[a],point[b],point[c])
 8 {
 9     double area;
10     double la,lb,lc;
11     la=sqrt((point[b].x-point[a].x)*(point[b].y-point[a].y));
12     lb=sqrt((point[c].x-point[b].x)*(point[c].y-point[b].y));
13     lb=sqrt((point[c].x-point[a].x)*(point[c].y-point[a].y));
14     p=(la+lb+lc)/2;
15     area=sqrt(p*(p-la)*(p-lb)*(p-lc));
16     return area;
17 }

二:向量计算法

此方法可查看此资料:

https://files.cnblogs.com/files/tenjl-exv/%E5%A4%9A%E8%BE%B9%E5%BD%A2%E9%9D%A2%E7%A7%AF.ppt

有关资料证明:

我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为

|x1 x2 x3|
S(A,B,C) =  |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)] /2
                   |1    1  1 |

(当三点为逆时针时为正,顺时针则为负的)

对于多边形A1A2A3、、、An(顺或逆时针都可以)

设平面上有任意的一点P,则有:

S(A1,A2,A3,、、、,An) = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))

P可以任意取点

如果P取多边形外一点,且取(0,0)时

设点顺序 (x1 y1) (x2 y2) ... (xn yn),则面积等于

|x1 y1|    |x2 y2|              |xn yn|
S= abs( |        | + |        | + ...... + |         | ) /2
             |x2 y2|    |x3 y3|              |x1 y1|
 
其中

|x1 y1| 
|         | ===  x1*y2 - y1*x2
|x2 y2|

因此面积公式展开为:

             |x1 y1|     |x2 y2|              |xn yn|
S=abs(  |        | +  |        | + ...... +  |        | )  = abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1) /2
             |x2 y2|     |x3 y3|              |x1 y1|

C++代码如下:

int x[100];
int y[100];

double Area(int *x,int *y,int n)
{
    double s=0;
    for(int i=0;i<n;i++)
    {
    int j=(i+1)%n;
        s+=x[i]*y[j];
        s-=x[j]*y[i];
    }
    s/=2;
    return (s>0?s:-s);
}

  //  area=Area(x,y,n);
  //  n为点的个数
时间: 2025-01-05 03:15:55

多边形面积的相关文章

多边形面积公式

多边形面积公式 设点顺序 (x1 y1) (x2 y2)    ... (xn yn) 则面积等于 |x1   y1 |      |x2   y2|                  |xn   yn| 0.5 * abs( |            | +   |           | + ...... +   |           | ) |x2   y2 |      |x3   y3|                  |x1   y1| 其中        |x1   y1| |

三角剖分求多边形面积的交 HDU3060

1 //三角剖分求多边形面积的交 HDU3060 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <stack> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 12 const int max

poj 1654 Area(求多边形面积)

题意:从原点出发向八个方向走,所给数字串每个数字代表一个方向,终点与原点连线,求所得多边形面积: 思路:(性质)共起点的两向量叉积的一半为两向量围成三角形的面积.以此计算每条边首尾两个向量的叉积,求和,除二: #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const dou

poj1408——叉积求多边形面积

poj1408——叉积求多边形面积 Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1853   Accepted: 1185 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previou

地球椭球面上多边形面积量算(C++代码)

昨天突然测试的时候发现以前产品中写的地球椭球面上面积计算的代码有点问题,于是今天就彻底修正,从QGIS中抠出代码来用C++重写了一下,新代码可以比较准确计算椭球面上多边形的面积,这个基础函数对空间量算功能中的面积量测非常重要,在这里共享出来供大家参考甚至直接拿过去用. 头文件如下: /** * @file DistanceArea.h * @brief 椭球面上计算多边形面积的接口文件 * @details * @author zxg * @date 2015年5月15日 * @version

多边形面积模板

HDU 2036 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20033    Accepted Submission(s): 10256 Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)”话说部分学生心态极好,每天就知道游戏,这次

HDU 3060 多边形面积并

Area2 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1197    Accepted Submission(s): 278 Problem Description 小白近期又被空军特招为飞行员,參与一项实战演习.演习的内容还是轰炸某个岛屿(这次的岛屿非常大,非常大非常大非常大,大到炸弹怎么扔都能全然在岛屿上引爆),看来小白确实是

Area - POJ 1654(求多边形面积)

题目大意:从原点开始,1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走.求出最后的多边形面积. 分析:这个多边形面积很明显是不规则的,可以使用向量积直接求出来面积即可. 代码如下: ------------------------------------------------------------------------------------------------------------------------------

HDU 3982 半平面交+圆与多边形面积交

Harry Potter and J.K.Rowling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 685    Accepted Submission(s): 210 Problem Description In July 31st, last month, the author of the famous novel seri

ZOJ 1010 Area 求任意多边形面积

主要判断是否是多边形:1.n<3 : 2.非相邻两条线段不相交 #include <iostream> #include <cmath> #include <stdio.h> using namespace std; #define eps 1e-8 int sig(double x) { if(x<-eps) return -1; if(x>eps) return 1; return 0; } struct point { double x,y; }