交差する直線の交点の座標を求める
台形の角と角とを結ぶ線の交わる点の座標を求めるための練習作品を作成しました。
各黒い点をドラッグ&ドロップすると各隅を結ぶ線が現れ、線の交わるポイントに常に赤い点が移動します。
ソース : Equation.as
/* 方程式を扱うクラス */ class Equation{ /* コンストラクタ : 呼び出し不可 */ private function Equation(){} // // 交差する直線の交点を求める // // o1 : 二点を通る直線1の各点の座標 : ( o1.x1, o1.y1 ), ( o1.x2, o1.y2 ) // o2 : 二点を通る直線2の各点の座標 : ( o2.x1, o2.y1 ), ( o2.x2, o2.y2 ) // // return : 交点の座標 or null( エラー ) // public static function crossPoint( o1:Object, o2:Object ):Object{ var x:Number; var y:Number; var A:Number = ( o1.y2 - o1.y1 )/( o1.x2 - o1.x1 ); var B:Number = ( o2.y2 - o2.y1 )/( o2.x2 - o2.x1 ); //平行線のためエラー if( A == B ){ return null; } //Type1 if( ( o1.x1 != o1.x2 ) && ( o2.x1 != o2.x2 ) ){ x = ( ( o1.x1*A ) - o1.y1 - ( o2.x1*B ) + o2.y1 )/( A-B ); y = A*( x-o1.x1 ) + o1.y1; //Type2 : o1が垂直 }else if( ( o1.x1 == o1.x2 ) && ( o2.x1 != o2.x2 ) ){ x = o1.x1; y = B*( x-o2.x1 ) + o2.y1; //Type3 : o2が垂直 }else if( ( o1.x1 != o1.x2 ) && ( o2.x1 == o2.x2 ) ){ x = o2.x1; y = A*( x-o1.x1 ) + o1.y1; } //データ返却 return { x:x, y:y }; } }
上のサンプルswfを例にした使用法
// // 各インスタンス名 // // 黒点左上 : mc0 // 黒点右上 : mc1 // 黒点左下 : mc2 // 黒点右下 : mc3 // 赤点 : pointMC // //各点を繋ぐ線の交差する座標を取得 var obj:Object = Equation.crossPoint( { x1:mc0._x, y1:mc0._y, x2:mc3._x, y2:mc3._y }, { x1:mc1._x, y1:mc1._y, x2:mc2._x, y2:mc2._y } ); //交差している座標へ赤点を設定 pointMC._x = obj.x; pointMC._y = obj.y;
Equation.crossPointメソッドは直線の方程式を利用して、二つの直線の方程式を連立方程式で解き、二つの直線が交差する点の座標を取得しています。Type1は二つの線が交わっている状態の時の解、Type2と3はどちらかの線が垂直線になっている場合の解(どちらかの線がx1==x2の場合)、Type4は両線が交わることのない平行線になっている場合の解となっています。
お久しぶりです、いつも読ませてもらってます。
Type1は厳密には両直線とも垂直ではないだけであって、平行線のパターンが無数に存在します。
A=Bの時がそれに該当するのですが、一応分けておいた方がいいのではないでしょうか。
ちなみに、台形に限定するならばもっと簡単な方法があります。
台形ABCDの対角線の交点をMと置く時、△ABM∽△CMDであることを利用するのですが
ここから先は考察してみてくださいなー
投稿者 Munegon : 2005年06月17日 04:30