ベクトルによる2D三角形の向きの判定

icon 項目のみ表示/展開表示の切り替え

概要

ベクトルによる2D三角形の向きの判定

ベクトルを使うと三角形の1辺に対して三角形が左右のどちらにあるか判定できます。

ベクトル

二次元のベクトルは、簡単に言うと方向と長さをxとyの長さで表現したものです。 上図のp3を原点にしてp3・p2とp3・p1の方向と長さをベクトルで表すと下記のとおりとなる。
p2x p3x p2x-p3x p2y p3y p2y-p3y
p3・p2 1159 -453.51 1612.51 -102.66 -753.19 650.53

p1x p3x p1x-p3x p1y p3y p1y-p3y
p3・p1 -312.93 -453.51 140.58 833.62 -753.19 1586.81
単純に2点間のx,y座標のそれぞれの距離を計算しているだけである。

三角形の向き

上図のようにたとえばv1ベクトルに対してv2ベクトルが左右のどちらにあるかわかれば三角形の向きがわかります。 ベクトルの外積を使うと簡単にできます。

外積

ベクトルの外積とは、下図を例にとるとv2の先端からv1へ垂線を下した時のその垂線の長さにv1の大きさを掛けた値、すなわち平行四辺形の面積なります。 ちなみに、二次ベクトルの外積は、大きさが垂線の長さで向きがZ軸方向となります。したがって次元をもっています。 外積を数式で表すと下式のとおりとなります。二次ベクトルの場合、三次ベクトルとなります。 v3=v1×v2 通常の式では掛けるの意味で「・」や「×」を使いますが、ベクトルに対して「・」は、ベクトルの内積を示すのでまったく別物です。 ベクトルでは「×」をcross積、「・」をドット積と表すこともあります。 大きさのみに注目すると下式でも表現できます。 s = |v1| |v2| sin θ | |はベクトルの大きさを表します。|v1| = √(v1.x^2+v1.y^2)
計算すると
xy
v1ベクトル1612.51650.53
v2ベクトル140.581586.81

外積の大きさ=v1.x * v2.y -v1.y * v2.x = 1612.51 * 1586.81 - 650.53 * 140.58 = 2467295.486 2467693.964 ベクトルで表記すると( 0,0,2467693.9638)となります 外積の符号が正なので、v1ベクトルに対してv2は右向きとわかります。 向きの定義は、外積がしめすベクトル方向にねじを締める方向が右向き、緩める方向が左向きとなります。 良くねじが進む向きとは、右ねじで締める方向のことを言っています。 ベクトル方向へ見ると必ず右回りになるのがみそです。 今回は、外積の方向が下から上方向なので、下からv1に対してv2をみると右回りということになります。

今度は、v2を基準にv1ベクトルの位置を求めてみます。
xy
v2ベクトル 140.58 1586.81
v1ベクトル 1612.51 650.53
外積=v1.x * v2.y -v1.y * v2.x = 140.58 * 650.53 - 1586.81 * 1612.51 = -2467295.486
ベクトルで表記すると( 0,0,-2467295.4857)となります 外積のベクトルは、値が負であることから上から下に向いていることになり、v2に対してv1は 外積の符号が負なので、下から見るとv2ベクトルに対してv1は左側とわかります。 ちなみに外積の値が0の場合、v1とv2ベクトルは重なっています。

左右の判断は、視点の方向(例えば、左手座標系と右手座標系の違い)により変わります。
例えばDirect Xは左手座標なのでZ軸の正方向が画面の奥となります。
OpenGLはZ軸方向が逆になっています。
PDF版