Adobe Flash非公式テクニカルノート 2次元平面で座標が三角形の内側にあるかを調べる
2次元平面において、ある座標が予め定められた形状の内側にあるかどうかを知りたいときがあります。その形状を三角形に分けた頂点座標が得られれば、ベクトルの外積を使って調べることができます。 01 ベクトルの外積と座標の位置関係 すると、逆に外積A×Bのベクトルの向きを調べれば、位置ベクトルBがAの右にあるか左にあるかを知ることができます。とくに、位置ベクトルAとBが2次元のxy平面上にあるときは、外積A×Bのz座標値の正負でベクトルBのAに対する位置がわかるということです(表001)。 表001■2次元平面における位置ベクトルの外積のz座標値とふたつのベクトルの位置関係
02 ベクトルの外積で座標が三角形の内側にあるかを調べる 図002■外積で2次元平面上の座標が三角形の内側にあるかどうかを調べる 以下の関数xIsRight()は、2次元平面の位置ベクトルAとBについて、BがAの右もしくはその上にあるかどうかをブール(論理)値で返します。引数には、位置ベクトルA(Ax, Ay)とB(Bx, By)のそれぞれのxy座標値を計4つ渡します。 スクリプト001■2次元平面のベクトルふたつの位置関係を返す関数
スクリプト第2〜3行目は、受取ったふた組のxy座標値から、z座標値を0としたVector3Dインスタンスを生成して変数(aとb)に納めます。つぎに、第4行目で、ふたつのベクトル(aとb)の外積を求めます(変数crossProduct)。そして、第5行目は外積のz座標値が0以上であるかどうかをブール値の変数(bIsRight)に納め、第6行目でその値を関数から返しています[*2]。 03 2次元平面におけるベクトルの外積 A×B = (AyBz - AzBy, AzBx - AxBz, AxBy - AyBx) 2次元のxy平面ではz座標値は0です。つまり、Az = Bz = 0ですので、外積A×Bのベクトルの成分はつぎのようになります。 A×B = (0, 0, AxBy - AyBx) 前掲スクリプト001の関数xIsRight()では、ふたつのVector3Dインスタンスを生成したうえで、その外積をVector3D.crossProduct()メソッドにより求めています。しかし、外積のxy座標はともに0と決まっており、ほしいのはz座標値だけです。そうであれば、z座標値の成分計算のみを四則演算で行った方が、ふたつのVector3Dインスタンスを生成するより端的でしょう。すると、関数xIsRight()はつぎのスクリプト002のように書替えられます[*3][*4]。 スクリプト002■2次元平面のベクトルふたつの位置関係を外積のz座標値の計算により返す関数
作成者: 野中文雄 Copyright © 2001-2010 Fumio Nonaka. All rights reserved. |
||||||||||||||||||