正射影ベクトル
正射影ベクトルに関してみていきます
英語でいうところの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)
これで、関数で使われている演算結果が求められました。
正射影ベクトルまとめ
図において、正射影ベクトルの概念と、プログラムにおいて、求め方を学びました