この記事のURL

http://www.dango-itimi.com/blog/archives/2005/000755.html


FLASH tips 交差する直線の交点の座標を求める

台形の角と角とを結ぶ線の交わる点の座標を求めるための練習作品を作成しました。

各黒い点をドラッグ&ドロップすると各隅を結ぶ線が現れ、線の交わるポイントに常に赤い点が移動します。

ソース : 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は両線が交わることのない平行線になっている場合の解となっています。

[ FLASH ] [ tips ] 投稿者 siratama : 2005年06月16日 23:57

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/717

コメント

お久しぶりです、いつも読ませてもらってます。

Type1は厳密には両直線とも垂直ではないだけであって、平行線のパターンが無数に存在します。
A=Bの時がそれに該当するのですが、一応分けておいた方がいいのではないでしょうか。

ちなみに、台形に限定するならばもっと簡単な方法があります。
台形ABCDの対角線の交点をMと置く時、△ABM∽△CMDであることを利用するのですが
ここから先は考察してみてくださいなー

投稿者 Munegon : 2005年06月17日 04:30

Munegonさん、どうもコメントありがとうございます。

>A=B
ああーっ 本当ですね。AとBはなんとなく式を見易くするために変数にまとめていたのですが、よく考えると傾きを示しているのですね。ということは先にA==Bの判定をしてエラーを返してしまえばよさそうです。

>△ABM∽△CMD
む、これは…、∽の意味が少しわかりませんでしたが、ABMを何倍かの大きさにするとCMDになる、といった そんな性質を持ったりするのでしたか。ということはということは…(?o?)。もっと私の頭が冴えている時に調査してみます。

昔使っていた数学や物理の本等 全部どこかにしまいこんでしまったので、きちんとした本を買っておいたほうがよさそうですなあ。

投稿者 siratama : 2005年06月17日 10:01

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]