1

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

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))。

4

2 回答 2

0

根据此链接,您说明的公式适用于凸多边形,但您给出的示例似乎不是一个。

ps 而不是二维数组,请考虑使用以下内容以获得更好的可读性。

struct Point{ 
   double x,y;
};

Point point[210];

...
a += point[i].x * point[i+1].y;
于 2013-01-06T11:49:50.853 回答
0

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

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

于 2013-01-07T10:56:07.837 回答