C++ 如何找到复杂多边形的面积-c++;

C++ 如何找到复杂多边形的面积-c++;,c++,geometry,polygon,computational-geometry,C++,Geometry,Polygon,Computational Geometry,对于非复杂多边形,它非常简单: 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 = 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;
}
上面的公式给了我28.000,应该是26.000。我能给出的唯一解释是,三角形(0,3)、(2,4)、(2,3)被计数两次(点(2,3)是线段(0,3)、(4,3)和(2,4)、(2,1)的交点)。

根据您所说明的公式,对于凸多边形是,但您给出的示例似乎不是

P.S.而不是2D数组,考虑使用下面的可读性更好。

struct Point{ 
   double x,y;
};

Point point[210];

...
a += point[i].x * point[i+1].y;
该公式适用于简单多边形(不自交多边形),凸多边形或非凸多边形。请注意,它计算多边形的有符号区域。如果(简单)多边形为顺时针方向,则使用该公式计算的面积将为负值


对于非简单多边形,公式计算多边形所有简单组件的有符号面积之和。您的示例组件具有自相交,事实上,其中一个组件,即三角形,对面积的贡献是两倍。

根据这一点:公式也适用于非凸多边形。您使用的公式适用于非自相交多边形,但直线(4,3)-(0,3)和(2,4)-(2,1)具有相交。对于自相交多边形,您需要了解如何处理相交。
struct Point{ 
   double x,y;
};

Point point[210];

...
a += point[i].x * point[i+1].y;