直線と点の距離をActionScriptで計算してみようと思います。非常に月並みですが、地味な感じですが。
直線は、例えば「y=ax+b」で表現されますが、一般的には「ax+by+c=0」になります。
この式の意味するところは、c=0 のとき、「ax+by=0」を考えるとわかりやすいかもしれません。
係数a,bをベクトルv、座標(x,y)をベクトルw1とすると、「ax+by=0」というのは、vとw1の内積になります。
ベクトルv1[x,y]とベクトルv2[x,y]の内積 v1.x*v2.x + v1.y*v2.y = v1.length*v2.length*Math.cos(radian)
内積が常に0になる、ということなので、Math.cos(radian)が常に0になるということです。
つまり、w1は常にvに対して垂直なベクトルになります。この点の集合が直線になります。
次に、直線「ax+by+c=0」ですが、先ほどと同じく、内積が常に-cになるベクトルw2の点の集合になります。
ここで、直線と原点の距離lは、
v.length*w2.length*Math.cos(radian) = -c ↓ Math.cos(radian) = -c/(v.length*w2.length) Math.cos(radian) = l/w2.length ↓ l = -c/v.length
になります。
で、ここから直線「ax+by+c=0」と点「p」の距離です。
点「p」を通り「ax+by+c=0」と平行な直線を「ax+by+d=0」とします。この2つの直線の距離は、直線と点の距離に同じです。
それぞれの原点からの距離の差になるので、
距離 = (-d/v.length) - (-c/v.length)
dは、d=-a*x-b*y → d=-a*p.x-b*p.y なので、
距離 = ( a*p.x + b*p.y + c)/v.length
になります。距離が得られれば、点から直線へ下ろした垂線のベクトルを得ることもできます。関数にするとこんな感じ。
// 直線:ax+by+c=0 /** * 直線と点の距離 * @param Point * @return 距離 */ public function distanceToPoint( p:Point ):Number{ return Math.abs( a*p.x + b*p.y + c )/Math.sqrt( a*a + b*b ); } /** * 点から直線へのベクトル * @param Point * @return Vector */ public function vectorFromPoint( p:Point ):Point{ //距離 var v:Point = new Point( a, b ); v.normalize( -( a*p.x + b*p.y + c )/v.length ); return v; }
なにか長々してしまいました。