SSブログ

Mac用プロットライブラリ-25「重なりチェックのアルゴリズム」 [考え中 - プロットライブラリ]

前回は2次元オブジェクトが重なっているかどうか、をどうやってチェックするか大まかなフローを考えた。これをもとにもう少し具体的なアルゴリズムを考えてみる。

AABBのアルゴリズム

オブジェクトに外接する長方形Rn

0913eq7.png
とする。つまり座標に沿った辺の範囲で指定されているとする。二つの長方形RnとRmが重ならない条件は、
0913eq8.png
ようするに、どちらかの座標軸に沿った区間がオーバーラップしなければ長方形は重なっていないと判断できる。これはこのままプログラムに書けるほど簡単。

交差判定法

ある頂点Pが多角形オブジェクトに内包されているかどうかを、交差判定法に従って頂点からx軸の正の方向に線を引いて辺と交差するかどうかを調べることにする。

0913fig26.png
図-26のように多角形の隣り合う二つの頂点A、Bの座標の値を取る(この座標を結ぶ線分が辺になっているはず) それぞれの座標を
0913eq10.png
とする。点Pから右側(xの正の方向)に向かう線分P+がこの辺と交差するかどうかを調べる。

辺ABの式を媒介変数を使って

0913eq13.png
と書く。σが媒介変数で
0913eq14.png
のとき、式-13の点は辺の上にある。

これを使ってまず

0913eq15.png
をσに関して解く。 つまり
0913eq16.png
として
  1. By-Ay= 0のとき、辺はy軸に平行なので分子のPy-Ayが0かどうかを調べる。0で無ければ交差しない。0ならばAx≤ Px ≤ Bx(あるいはBx≤ Px ≤ Ax)であるかを調べる。範囲にあれば点Pは辺の上にある
  2. 式-16のσの値が
    1. σ<0、あるいはσ>1なら上下方向にはずれているので交差しない
    2. 0≤σ≤1ならこのσを使って式-13のx座標を計算する。その値をCxとする。つまり、
      0913eq17.png
      としたとき
      1. Cx < Pxなら辺ABは点Pの左側(x軸の負の方向)にあるのでP+とは交差しない
      2. Cx ≥ Pxなら交差する
となる。

これはめんどくさいけどわかりやすい。でも多くの場合に割り算が発生する。できればなるべく計算を減らしたい。

なるべく計算量が少なくなるように

そこでもう少し場合分けをしてみる。

  1. A、Bのx座標が両方ともPのx座標よりも小さい場合
    0913eq18.png
    交差無し(図-27)
    0913fig27.png
  2. 少なくともどちらか一方のx座標がPのx座標よりも大きい場合で、y座標が両方とも大きい、あるいは両方とも小さい場合
    0913eq19.png
    は交差無し(図-28)。ここで、max(a,b)、min(a,b)はa、bの大きい方、小さい方をとると言う意味である。
    0913fig28.png
  3. Ax、Bx両方がPxより大きく、yは一方が小さく一方が大きい場合
    0913eq20.png
    は交差有り(図-29) 0913fig29.png
  4. xもyもA、Bの区間にPが挟まれる場合
    0913eq21.png
    これは、残りの場合のはずだけど、式-17を計算して
    1. Cx < Pxなら交差しない
    2. Cx ≥ Pxなら交差する
とする。 ただし、
  1. AまたはBの少なくともどちらか一方のx座標がPのx座標と等しい場合が見つかったらその時点で内包していると見なして終わる
  2. 多角形オブジェクトが開領域の場合、暫定的に頂点を追加して上の手順を行う
とする。

本来なら描画する線(NSBezierPath)の幅を含めて考えなければいけないが、あまり太い線は描かないとしてとりあえず無視することにする。後から見て表現がおかしいようなら修正する。

多角形オブジェクトが開領域と言うのは今回の場合、オブジェクトの一部が視野の外に出ているときしかないので、視野で切り取られた端の点を頂点として追加する。これは描画のときはこの点があってもなくても最終的にクリップされるので「暫定的な頂点」として計算する必要がある。

ああ、めんどくさい。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。