GameCorder.net

このエントリーをはてなブックマークに追加

正射影ベクトル

正射影ベクトルに関してみていきます
英語でいうところのProductionVectorです
どのような概念なのか?図で見て見ます。

赤色で表示されているベクトルaとベクトルcの正射影ベクトルになります。
図でみてわかるように、正射影ベクトルpはcベクトルからaベクトルに垂直に下ろしたベクトルdの端点になっています。 では、正射影ベクトルpをjavascriptで関数化してみます。

正射影ベクトルをプログラムで表す

function projectVector(project,onto)
	// 内積を使って長さを求める
	float d = dotProduct(onto,onto);
	
	if(0 < d){
		float dp = dotProduct(project,onto);
		
		return multiply_vector(onto,dp / d);
	}
	return onto;
}
		

これを解析しましょう。
図に添って見ていきます。

ソース解析

        (1)ベクトルaとベクトルcのなす角をαとすると、
        三角関数より、
        cos(α) = length(p) / length(b)
        
        (2)内積の定義により
        cos(α) * length(v1) * length(v2) = dotProduct(v1,v2);
        より、
        
        (3)これを図に当てはめると
        cos(α) * length(a) * length(b) = dotProduct(a,b);
        
        (4)
        (1)(3)を用いて、cos(α)入れ替えて、
        
        (length(p) / length(b)) * length(a) * length(b) = dotProduct(a,b);
        
        (5).(4)を計算し、length(b)を消去して、
        
        length(p) = dotProduct(a,b) / length(a);
        
        (6)単位ベクトルpと単位ベクトルaは同じベクトルであるから、
        unitVector(p) = unitVector(a) = p / length(p);
        
        (7)また、ベクトルpは以下のようにも表すことができる
        p = unitVector(a) * length(p);
        
        (8).(7),(5)を用いて、以下のように表すことができる
        p = unitVector(a) * dotProduct(a,b) / length(a);
        
        (10).(8)のunitVectorを計算して
	p = (a / length(a)) * (dotProduct(a,b) / length(a));
		
	(11)これを計算して
	p = a * dotProduct(a,b) / length(a) * length(a)
		
	(12)length(a)を内積に置き換えて
	p = a * dotProduct(a,b) / dotProduct(a,a)        
        

これで、関数で使われている演算結果が求められました。

正射影ベクトルまとめ

図において、正射影ベクトルの概念と、プログラムにおいて、求め方を学びました