N88-BASICで行列(matrix) (2回目)
2021/6/24(木)
N88-BASICで行列(matrix) (2回目)
(by ULproject for N88-BASIC, NL-BASIC)
今回は、前回の併進移動に回転移動を追加します
(キー操作はプログラムの最終行コメント参照)
前回同様、行列は大文字、ベクトルとスカラーは
小文字で、行列は4×4(4行4列)とし、ベクトルは
3次元(4次元目は常に1)とします
またベクトル上部の矢印は省いています
まず、位置ベクトルp=(x,y,z)を単位ベクトル
n=(n1,n2,n3)まわりにθ度回転した
点p'=(x',y',z')を求める式は
図1 位置ベクトルの回転
|p'- q|=|p - q|, |a| = |p - q|cosθ
a = |a|(p - q)/|p - q|
= (p - q)cosθ = pcosθ - qcosθ
|n×p|はnとpでできる平行四辺形の
面積なので底辺|n|=1と高さ|p - q|の積
|n×p| = |n||p - q| = |p - q|より、
b = |p - q|sinθ(n×p)/|n×p|
= (n×p)sinθ
q = (n・p)n
p'= q + a + b
= q+pcosθ-qcosθ+(n×p)sinθ
= pcosθ+(1-cosθ)q+(n×p)sinθ
p'= pcosθ+(1-cosθ)(n・p)n+(n×p)sinθ
を、p' =Rpの形に変形していきます
外積a×bと内積a・bの成分表記について、
x,y,z軸方向の単位ベクトルをi,j,k、
a=(x,y,z),b=(x',y',z')とすると、
i×i = j×j = k×k = 0ベクトル
i×j = k , j×k = i , k×i = j
j×i = -k , k×j = -i , i×k = -j
より
a×b
= (ix + jy + kz)×(ix'+ jy'+ kz')
= kxy'-jxz'-kyx'+iyz'+jzx'-izy'
= (yz'-zy')i+(zx'-xz')j+(xy'-yx')k
= (yz'- zy', zx'- xz', xy'- yx')
i・i = j・j = k・k = 1、これ以外0より、
a・b
= (ix + jy + kz)・(ix' + jy' + kz')
= xx' + yy' + zz'
a×bは、大きさ|a×b|がaとbで出来る
平行四辺形の面積で、aとbに垂直でaから
bに右手の親指以外を向けた時、親指の方向
a・b = |a||b|cosθで、|b|をaに垂直に
投影した長さと|a|の積となります
(θはaとbのなす角)
p = (x,y,z)より、
pcosθ= (xcosθ, ycosθ, zcosθ)
|xcosθ| |cosθ 0 0 ||x|
=|ycosθ|=| 0 cosθ 0 ||y|
|zcosθ| | 0 0 cosθ||z|
n = (n1,n2,n3)より、
(n・p)n
|(n1x + n2y + n3z)n1|
=|(n1x + n2y + n3z)n2|
|(n1x + n2y + n3z)n3|
|n1n1 n1n2 n1n3||x|
=|n2n1 n2n2 n2n3||y|
|n3n1 n3n2 n3n3||z|
n×p
|n2z - n3y| | 0 -n3 n2||x|
=|n3x - n1z|=| n3 0 -n1||y|
|n1y - n2x| |-n2 n1 0 ||z|
cosθ+n1n1(1-cosθ) = n1n1+(1-n1n1)cosθ
p' = pcosθ+(1-cosθ)(n・p)n+(n×p)sinθ
は、p'=Rpとして、
|r11 r12 r13|
R=|r21 r22 r23|
|r31 r32 r33|
r11 = n1n1+(1-n1n1)cosθ
r22 = n2n2+(1-n2n2)cosθ
r33 = n3n3+(1-n3n3)cosθ
r12 = n1n2(1-cosθ)-n3sinθ
r21 = n2n1(1-cosθ)+n3sinθ
r13 = n1n3(1-cosθ)+n2sinθ
r31 = n3n1(1-cosθ)-n2sinθ
r23 = n2n3(1-cosθ)-n1sinθ
r32 = n3n2(1-cosθ)+n1sinθ
となり、回転行列Aは
|r11 r12 r13 0|
A=|r21 r22 r23 0|
|r31 r32 r33 0|
|0 0 0 1|
です
ベクトル(x,y,z)軸回りにd°回転するプログラム
(角度は度→ラジアン、(x,y,z)→単位ベクトルn)
*ROTATE
PI = 3.141592653589793
RR = SQR(X*X + Y*Y + Z*Z)
N1 = X / RR
N2 = Y / RR
N3 = Z / RR
TT = D * PI / 180
SS = COS(TT)
RR = 1.0 - SS
A( 0) = N1 * N1 * RR + SS
A( 5) = N2 * N2 * RR + SS
A(10) = N3 * N3 * RR + SS
SS = SIN(TT)
TT = N1 * N2 * RR: NN = N3 * SS: A(4) = TT - NN: A(1) = TT + NN
TT = N1 * N3 * RR: NN = N2 * SS: A(2) = TT - NN: A(8) = TT + NN
TT = N2 * N3 * RR: NN = N1 * SS: A(9) = TT - NN: A(6) = TT + NN
A(12) = 0: A(13) = 0: A(14) = 0: A(15) = 1
A( 3) = 0: A( 7) = 0: A(11) = 0
GOSUB *MULT.MA
RETURN
となります
NL-BASICとblg~.zip(mat002.bas)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
次回のおすすめ
N88-BASICでクォータニオン(quaternion) (1回目)