アトリエ ぺっぺ

トップページ > プログラムTips > 領域の点列から面積を求める

◆ 領域の点列から面積を求める
順番に並んでいる多角形の領域点列の面積を求めるときには、下記のようにします。
 
■ 必要な情報:
  ○ a個の点列 pt[a] ⇒ (x1,y1),(x2,y2),・・・(xa,ya)
   ※ aは3以上でなければなりません。
 
    double S = 0.0;
    for(int i = 0; i < a - 1; i++){
        S += (pt[i].x * pt[i + 1].y - pt[i].y * pt[i + 1].x) / 2.0;
    }
    S = abs(S);
ここでのSが、多角形の面積になります。
 
※ 解説
上の式で何をしているかを、順番に解説します。
for文の中で繰り返している式は、多角形の辺と原点(0,0)を結んでできる三角形の面積を求めています。
これは、以下のような三角形の面積の公式を使用しています。
 
座標平面上で、点A(x1,y1)、点B(x2,y2)、原点(0,0)を結んでできる三角形の面積は、
    S = | x1 * y2 - y1 * x2 | / 2
 
上記の(|ホニャララ|)は、ホニャララの絶対値をあらわします。
 
つまり、繰り返し文の中で、多角形の一辺ずつ、全ての点に対して原点と結んでできる三角形の面積を算出し、足していっています。
しかし繰り返し部分では、公式と違い、特に絶対値を出す処理をしていません。
この理由は次のとおりです。
辺と原点で作られる三角形を全て足していくと、原点が多角形の領域の中にある場合は、全ての三角形の和が、多角形の面積となります。
 

 
これに対し、原点が多角形の領域の外にある場合、余計な領域も取り込んでしまいます。下の絵の暗めの色のところですね。
 

 
ここでよく見て欲しいのですが、余計な領域は、辺と原点で作った三角形が重なっています。
そして、余計な部分に完全に重なる(つまり多角形の領域に重なっていない)三角形が存在していることもわかると思います。
上の絵では、原点に近い辺を使って作成できる2つの三角形ですね。
つまり多角形の面積を出すには、多角形領域と重なっている三角形の全面積と、多角形領域に重なっていない三角形の全面積の差、ということになります。
 

 
この完全に余計な部分に重なる三角形と、多角形の領域に重なる三角形の違いは、辺の頂点1・2の位置関係で判断することができます。
原点から頂点1への線分を作り、頂点2がその線分の右にあるか左にあるかを判定することで、それが足すべき三角形か引くべき三角形かが決定されます。
線と点の位置関係を調べるには、平面での線と点の位置関係を見ていただくとその方法が書いてあります。
しかし、そこで使う計算式は、まさに三角形の面積算出の式から絶対値処理を無くしたものと同じ式です。
そして位置関係を判断するために使用するのが、式で出される値の正負なのです。
従って、面積算出の段階で、絶対値処理をせず、そのまま値を加算していけば、二種類の三角形の面積の差が算出される、というわけです。
ここでの面積の符号は、領域点列が時計回りか反時計回りかで逆になります。
そのため、最後にabs()関数を使用して、絶対値の処理をしています。
 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp