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回カウントされるということでした(ポイント (2,3) はセグメント (0,3) の交点です) (4,3) および (2,4) 、(2,1))。

4

2 に答える 2

0

このリンクによると、あなたが示した式は凸多角形用ですが、あなたが示した例はそうではないようです。

ps 2D 配列の代わりに、読みやすくするために以下を使用することを検討してください。

struct Point{ 
   double x,y;
};

Point point[210];

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

その式は、単純なポリゴン (自己交差していないもの)、凸面であるかどうかに関係なく機能します。多角形の符号付き面積を計算することに注意してください。(単純な) ポリゴンが時計回りに方向付けられている場合、その式を使用して計算された面積は負になります。

単純でない多角形の場合、式は多角形のすべての単純コンポーネントの符号付き面積の合計を計算します。コンポーネントの例には自己交差があり、実際にはその 1 つのコンポーネントである三角形が領域に 2 回寄与しています。

于 2013-01-07T10:56:07.837 に答える