⍝ Quaternion arithmetic:
ijk ← ↓ ⍎H'0i1 0j1 0k1' ⍝ unit vectors: i j k
⍕H¨ ijk ∘.(×H) ijk ⍝ i² = j² = k² = -1
┌────┬────┬────┐
│¯1 │0k1 │0j¯1│
├────┼────┼────┤
│0k¯1│¯1 │0i1 │
├────┼────┼────┤
│0j1 │0i¯1│¯1 │
└────┴────┴────┘
⍕H ⊃×H/ ijk ⍝ ijk = -1
¯1
dp ← {(10*-⍺)×⌊0.5+⍵×10*⍺} ⍝ rounded to ⍺ decimal places
∆ ← ⍕H∘(2∘dp) ⍝ format of rounded result
S ← ⍳4 ⍝ quaternion scalar
M ← 2 3 4⍴⍳24 ⍝ .. matrix
∆ M ⍝ formatted matrix
1i2j3k4 5i6j7k8 9i10j11k12
13i14j15k16 17i18j19k20 21i22j23k24
∆ +H M ⍝ conjugate (q*)
1i¯2j¯3k¯4 5i¯6j¯7k¯8 9i¯10j¯11k¯12
13i¯14j¯15k¯16 17i¯18j¯19k¯20 21i¯22j¯23k¯24
∆ ÷H M ⍝ reciprocal
0.03i¯0.07j¯0.1k¯0.13 0.03i¯0.03j¯0.04k¯0.05 0.02i¯0.02j¯0.02k¯0.03
0.02i¯0.02j¯0.02k¯0.02 0.01i¯0.01j¯0.01k¯0.01 0.01i¯0.01j¯0.01k¯0.01
∆ |H M ⍝ norm
5.48 13.19 21.12
29.09 37.07 45.06
∆ |H ⍎H '2i4j5k6' ⍝ whole-number norm cf: |3j4 → 5
9
∆ ×H M ⍝ direction (unit versor)
0.18i0.37j0.55k0.73 0.38i0.45j0.53k0.61 0.43i0.47j0.52k0.57
0.45i0.48j0.52k0.55 0.46i0.49j0.51k0.54 0.47i0.49j0.51k0.53
∆ S +H M ⍝ sum
2i4j6k8 6i8j10k12 10i12j14k16
14i16j18k20 18i20j22k24 22i24j26k28
∆ S -H M ⍝ difference
0 ¯4i¯4j¯4k¯4 ¯8i¯8j¯8k¯8
¯12i¯12j¯12k¯12 ¯16i¯16j¯16k¯16 ¯20i¯20j¯20k¯20
∆ S ×H M ⍝ product
¯28i4j6k8 ¯60i12j30k24 ¯92i20j54k40
¯124i28j78k56 ¯156i36j102k72 ¯188i44j126k88
∆ M ×H S ⍝ product is non-commutative
¯28i4j6k8 ¯60i20j14k32 ¯92i36j22k56
¯124i52j30k80 ¯156i68j38k104 ¯188i84j46k128
∆ M ×H +H M ⍝ qq* is real
30 174 446
846 1374 2030
∆ M ÷H S ⍝ right quotient M×(÷S)
1 2.33i¯0.27k¯0.53 3.67i¯0.53k¯1.07
5i¯0.8k¯1.6 6.33i¯1.07k¯2.13 7.67i¯1.33k¯2.67
∆ (÷H S)×H M ⍝ left quotient (÷S)×M
1 2.33j¯0.53k¯0.27 3.67j¯1.07k¯0.53
5j¯1.6k¯0.8 6.33j¯2.13k¯1.07 7.67j¯2.67k¯1.33
cube ← 0,⍉2 2 2⊤0 to 7 ⍝ unit cube
cube
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
spin ← {15 dp(○⍺÷180)⌽H ⍵} ⍝ ⍵ rotated ⊃⍺° about 1↓⍺ vector
120 1 1 1 spin cube ⍝ 120° rotation about 1 1 1 diagonal
0 0 0 0
0 1 0 0
0 0 0 1
0 1 0 1
0 0 1 0
0 1 1 0
0 0 1 1
0 1 1 1
⍕H ↑ cube (120 1 1 1 spin cube) ⍝ formatted cube and 120° rotation
0 0k1 0j1 0j1k1 0i1 0i1k1 0i1j1 0i1j1k1
0 0i1 0k1 0i1k1 0j1 0i1j1 0j1k1 0i1j1k1
a ← ○÷3 ⍝ 60° rotation angle around vector:
u ← 0,2 1○○÷3 ⍝ 60° from y axis in y z plane
p ← 1 ¯1 2 ⍝ position before rotation
x ← (10 1 14+4 2 ¯3×3*÷2)÷8 ⍝ expected position after rotation
:If ⎕FR=645
(0,x) ≡ (a,u)⌽H 0,p ⍝ check against expected
1
:Else ⍝ <V>1287
:EndIf
M ≡ ⍎H ⍕H M ⍝ check ⍎ ⍕ round-trip
1
⍝∇ H to
Back to: code
Back to: Workspaces