Quaternion type: Difference between revisions

Added example of Red language
(→‎{{header|Lua}}: Moved output outside of <lang />)
(Added example of Red language)
Line 5,777:
#f
</pre>
 
=={{header|Red}}==
<lang Red>
quat: context [
quaternion!: make typeset! [block! hash! vector!]
multiply: function [q [integer! float! quaternion!] p [integer! float! quaternion!]][
case [
number? q [collect [forall p [keep p/1 * q]]]
number? p [collect [forall q [keep q/1 * p]]]
'else [
reduce [
(q/1 * p/1) - (q/2 * p/2) - (q/3 * p/3) - (q/4 * p/4)
(q/1 * p/2) + (q/2 * p/1) + (q/3 * p/4) - (q/4 * p/3)
(q/1 * p/3) + (q/3 * p/1) + (q/4 * p/2) - (q/2 * p/4)
(q/1 * p/4) + (q/4 * p/1) + (q/2 * p/3) - (q/3 * p/2)
]
]
]
]
add: func [q [integer! float! quaternion!] p [integer! float! quaternion!]][
case [
number? q [head change copy p p/1 + q]
number? p [head change copy q q/1 + p]
'else [collect [forall q [keep q/1 + p/(index? q)]]]
]
]
negate: func [q [quaternion!]][collect [forall q [keep 0 - q/1]]]
conjugate: func [q [quaternion!]][collect [keep q/1 q: next q forall q [keep 0 - q/1]]]
norm: func [q [quaternion!]][sqrt first multiply q conjugate copy q]
normalize: function [q [quaternion!]][n: norm q collect [forall q [keep q/1 / n]]]
inverse: func [q [quaternion!]][(conjugate q) / ((norm q) ** 2)]
]
 
set [q q1 q2 r] [[1 2 3 4] [2 3 4 5] [3 4 5 6] 7]
 
print [{
1. The norm of a quaternion:
`quat/norm q` =>} quat/norm q {
 
2. The negative of a quaternion:
`quat/negate q` =>} mold quat/negate q {
 
3. The conjugate of a quaternion:
<code>quat/conjugate q</code> =>} mold quat/conjugate q {
 
4. Addition of a real number `r` and a quaternion `q`:
`quat/add r q` =>} mold quat/add r q {
`quat/add q r` =>} mold quat/add q r {
 
5. Addition of two quaternions:
`quat/add q1 q2` =>} mold quat/add q1 q2 {
 
6. Multiplication of a real number and a quaternion:
`quat/multiply q r` =>} mold quat/multiply q r {
`quat/multiply r q` =>} mold quat/multiply r q {
 
7. Multiplication of two quaternions `q1` and `q2` is given by:
`quat/multiply q1 q2` =>} mold quat/multiply q1 q2 {
 
8. Show that, for the two quaternions `q1` and `q2`:
`equal? quat/multiply q1 q2 mold quat/multiply q2 q1` =>} equal? quat/multiply q1 q2 quat/multiply q2 q1]
</lang>
 
Output:
 
1. The norm of a quaternion:
<code>quat/norm q</code> => <code>5.477225575051661</code>
 
2. The negative of a quaternion:
<code>quat/negate q</code> => <code>[-1 -2 -3 -4]</code>
 
3. The conjugate of a quaternion:
<code>quat/conjugate q</code> => <code>[1 -2 -3 -4]</code>
 
4. Addition of a real number <code>r</code> and a quaternion <code>q</code>:
<code>quat/add r q</code> => <code>[8 2 3 4]</code>
<code>quat/add q r</code> => <code>[8 2 3 4]</code>
 
5. Addition of two quaternions:
<code>quat/add q1 q2</code> => <code>[5 7 9 11]<code>
 
6. Multiplication of a real number and a quaternion:
<code>quat/multiply q r</code> => <code>[7 14 21 28]</code>
<code>quat/multiply r q</code> => <code>[7 14 21 28]</code>
 
7. Multiplication of two quaternions <code>q1</code> and <code>q2</code> is given by:
<code>quat/multiply q1 q2</code> => <code>[-56 16 24 26]</code>
 
8. Show that, for the two quaternions <code>q1</code> and <code>q2</code>:
<code>equal? quat/multiply q1 q2 mold quat/multiply q2 q1</code> => <code>false</code>
 
=={{header|REXX}}==
Anonymous user