如何找到一个复杂多边形的面积- c++

How to find the area of a complex polygon - c++

本文关键字:多边形 c++ 复杂 一个 何找      更新时间:2023-10-16

对于非复杂多边形,这很简单:

A = 1/2 * (x1*y2 - x2*y1 + x2*y3 - x3*y2 + ... + x(n-1)*yn - xn*y(n-1) + xn*y1 - x1*yn)

这是我在c++中的实现:

struct Point { 
    double x, y;
} point[210];
double area(int n) {
    double a=0, b=0;
    for(int i=0; i<n-1; ++i) {
        a += point[i].x * point[i+1].y;
        b += point[i].y * point[i+1].x;
    }
    return (a - b)/2;
}

但是如果多边形是复数呢?有没有类似的方法来求它的面积?

注意:我尝试使用相同的技术,但它不起作用。对于多边形

(0,0) , (0,7) , (4,3) , (0,3) , (2,4) , (2,1) , (0, 0)

上面的公式给我28000,应该是26000。我能给出的唯一解释是三角形(0,3),(2,4),(2,3)被计数了两次(点(2,3)是段(0,3),(4,3)和(2,4),(2,1)的交点)。

根据这个链接,你所说明的公式是对于凸多边形,但是你给出的例子似乎不是一个。

注。为了更好的可读性,可以考虑使用下面的数组来代替2D数组。

struct Point{ 
   double x,y;
};
Point point[210];
...
a += point[i].x * point[i+1].y;

该公式适用于简单的多边形(那些不自相交的多边形),凸或非凸。注意,它计算多边形的带符号的面积。如果(简单)多边形顺时针方向,使用该公式计算的面积将是负的。

对于非简单多边形,公式计算该多边形所有简单分量的带符号面积之和。您的示例组件具有自相交,并且它的一个组件,三角形,贡献了两倍的面积。