2005年01月06日

正射影

↑のような点A、B、Cを線ACに沿って一直線にそろえるには

B’がAC上にある、Bから最も近い点
uはACの単位ベクトル(ACの長さを1にしたベクトル)
AB’の長さは、ABとuの内積と等しい


Aが原点になるようにBとCからAを引いておく
B(Bx−Ax, By−Ay, Bz−Az)
C(Cx−Ax, Cy−Ay, Cz−Az)

uを求める
len(ACの長さ) = √Cx × Cx + Cy × Cy + Cz × Cz
u(Cx ÷ len , Cy  ÷ len , Cz ÷ len)

ABとuの内積を求める
d = Bx × ux + By × uy + Bz × uz

B’の座標を求める
B’(Cx × d + Ax , Cy × d + Ay , Cz × d + Az)


Cで書くと
bool hoge(const LWDVector S, const LWDVector E, LWDVector out)
{
LWDVector B, C, u;
double len, d;
int i;

for(i=0; i<3; i++) B[i] = out[i] - S[i];
for(i=0; i<3; i++) C[i] = E[i] - S[i];

len = sqrt(C[0]*C[0] + C[1]*C[1] + C[2]*C[2]);
if( 0 == len ) return false;
if( 0.0 == len ) return false;
for(i=0; i<3; i++) u[i] = C[i] / len;

d = B[0]*u[0] + B[1]*u[1] + B[2]*B[2];
d = B[0]*u[0] + B[1]*u[1] + B[2]*u[2];

for(i=0; i<3; i++) out[i] = C[i] * d + S[i];

return true;

}

posted by toka at 19:58| Comment(0) | TrackBack(0) | 数学・3D基礎知識 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。