投稿

6月, 2021の投稿を表示しています

N88-BASICでクォータニオン(quaternion) (2回目)

イメージ
2021/6/27(日) N88-BASICでクォータニオン(quaternion) (2 回 目 )   (by ULproject for N88-BASIC,NL-BASIC) 行列 (matrix)の代わりに四元数(しげんすう) (quaternion)を使用して見ました。   今回は、四元数から行列を作り 回転移動させました   p = (x, y, z) q = (a, b, c) Q = (w, q) = (w, a, b, c) p'= QpQ~ p'= (w 2 -q・q)p+2(q・p)q+2w(q×p)   (w 2 -q・q)p  |w 2 -a 2 -b 2 -c 2  0 0||x| =|0 w 2 -a 2 -b 2 -c 2  0||y|  |0 0 w 2 -a 2 -b 2 -c 2 ||z|   (q・p)q =(ax+by+cz)q =(a 2 x+aby+acz,bax+b 2 y+bcz,cax+cby+c 2 z) |a 2  ab ca||x| =|ab b 2  bc||y|  |ca bc c 2 ||z|   (q×p) =(bz-cy, cx-az, ay-bx) =(bz,cx,ay)-(cy,az,bx)    | 0 -c  b||x| =| c  0 -a||y|  |-b  a  0||z|   w 2 +a 2 +b 2 +c 2  = 1よりw 2  = 1-a 2 -b 2 -c 2     p'= QpQ~ = (w 2 -q・q)p+2(q・p)q+2w(q×p)    |w 2 -a 2 -b 2 -c 2 +2a 2  2(ab-wc) 2(ca+wb)||x| =|2(ab+wc) w 2 -a 2 -b 2 -c 2 +2b 2  2(bc-wa)||y|  |2(ca-wb) 2(bc+wa) w 2 -a 2 -b 2 -c 2 -2c 2 ||z|    |1-2(b 2 +c 2 )  2(ab-wc)  2(ca+wb)||x| =| 2(ab+wc) 1-2(c 2 +a 2 )  2(bc-wa)||y|  | 2(ca-wb)  2(bc+wa) 1-2(a 2 +b 2 )||z|   並進移動 T=(0,tx,ty,tz)を入れると p&#

N88-BASICでクォータニオン(quaternion) (1回目)

イメージ
2021/6/25(金) N88-BASICでクォータニオン(quaternion)  (1回目) (by ULproject for N88-BASIC,NL-BASIC)   行列 (matrix)の代わりに四元数(しげんすう) (quaternion)を使用して見ました。       以後、四元数と行列を大文字、それ以外を 小文字で表します   四元数は複素数 (2元)の四元版です。 ii = jj = kk = -1 ij =  k, jk =  i, ki =  j ji = -k, kj = -i, ik = -j となる、 i,j,kを定義します。   複素数      c  = a + bi 共役複素数  c~ = a - bi (cにオーバーバーですがここではc~ とします。 ) 四元数      Q  = a + bi + cj + dk 共役四元数  Q~ = a - bi - cj - dk   複素数は複素平面上の点 cを表せます。   四元数では 1つの実数wと三次元空間 の点 q=(x,y,z)を表すことにします。   Q = w + ix + jy + kz   = (w, x,y,z)   = (w, q) wはスカラー、qはベクトル i,j,kがx,y,z軸の単位ベクトル になっているのに似ています。 q = (x,y,z) = ix + iy + kz   四元数の積 Q   =  w  +  ix  +  jy  +  kz Q' =   w' +  ix' +  jy' +  kz'   QQ' =  ww'+ wix'+ wjy'+ wkz' + ixw'+iixx'+ijxy'+ikxz' + jyw'+jiyx'+jjyy'+jkyz' + kzw'+kizx'+kjzy'+kkzz'       =  ww'+ wix'+ wjy'+ wkz'     + ixw'-  xx'+ kxy'- jxz'     + jyw'- kyx'-  yy'+ iyz&

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=(n 1 ,n 2 ,n 3 )まわりにθ度回転した 点 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'