| INDEX |

直線と直線の交点を計算してみようと思います。


2つの直線、「ax+by+c=0」と「gx+hy+i=0」があるとき、それらが交わるかどうかは、平行であるかどうかを調べればわかります。これは外積で判別できます。

ベクトルv1[x,y]とベクトルv2[x,y]の外積
v1.x*v2.y - v1.y*v2.x = v1.length*v2.length*Math.sin(radian)

この場合、ベクトル(a,b)とベクトル(g,h)の外積が0の場合、sinが0になるので平行ということになります。

で、交点の位置は、下図のようにベクトルv1、ベクトルv2をおいたとき、ベクトルwは、w=k1*v1+k2*v2 で表現できます。k1,k2は係数で、この係数を求めます。

このとき、Dに注目すると、これは直線「ax+by+c=0」と原点の距離で、-c/v1.length です。一方、v1とv2のなす角度から考えると、v2.length*Math.sin(θ)のk2倍とDは等しくなります。

D = -c/v1.length = k2 * v2.length*Math.sin(θ)
 ↓
k2 = -c/( v1.length*v2.length*Math.sin(θ) ) ←ここが外積になる
 ↓
k2 = -c/(-b*g + h*a)

同様に、k2を求めると、

k1 = i/(-b*g + h*a)

になります。
w=k1*v1+k2*v2 なので、

w = ( k1*-b + k2*-h , k1*a + k2*g )
cross = -b*g + h*a
 ↓
w = ( ( -i*b + c*h)/cross , (i*a - c*g)/cross )

スクリプトにすると、

var cross:Number = -b*g + h*a;
if( cross!=0 ){
  //交点
  return new Point( (-b*i + c*h)/cross , (i*a - c*g)/cross );
}else{
  //2つの直線は平行
  return null;
}

になります。

>> source

| INDEX |