如何找到复杂多边形的区域 - c ++

时间:2013-01-06 11:46:45

标签: 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 += 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)

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

2 个答案:

答案 0 :(得分:0)

根据this link,您所说明的公式为凸多边形的 ,但您提供的示例似乎不是

P.S。而不是2D数组,请考虑使用以下内容以获得更好的可读性。

struct Point{ 
   double x,y;
};

Point point[210];

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

答案 1 :(得分:0)

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

对于非简单多边形,公式计算多边形的所有简单组件的有符号区域的总和。您的示例组件具有自交叉,实际上它的一个组件(三角形)对该区域贡献两倍。