Quaternion type: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Sidef}}: Fix link: Perl 6 --> Raku) |
No edit summary |
||
Line 1,476: | Line 1,476: | ||
q-q1-q2 = +0.0+1.0i-1.0j-1.0k |
q-q1-q2 = +0.0+1.0i-1.0j-1.0k |
||
</pre> |
</pre> |
||
=={{header|Crystal}}== |
|||
<lang ruby>class Quaternion |
|||
property a, b, c, d |
|||
def initialize(@a : Int64, @b : Int64, @c : Int64, @d : Int64) end |
|||
def norm; Math.sqrt(self.a**2 + self.b**2 + self.c**2 + self.d**2) end |
|||
def conj; Quaternion.new(self.a, -self.b, -self.c, -self.d) end |
|||
def +(rhs : Quaternion) |
|||
Quaternion.new(self.a + rhs.a, self.b + rhs.b, self.c + rhs.c, self.d + rhs.d) |
|||
end |
|||
def +(rhs : Int32 | Int64) |
|||
Quaternion.new(self.a + rhs, self.b, self.c, self.d) |
|||
end |
|||
def -(rhs : Quaternion) |
|||
Quaternion.new(self.a - rhs.a, self.b - rhs.b, self.c - rhs.c, self.d - rhs.d) |
|||
end |
|||
def *(rhs : Quaternion) |
|||
Quaternion.new( |
|||
self.a * rhs.a - self.b * rhs.b - self.c * rhs.c - self.d * rhs.d, |
|||
self.a * rhs.b + self.b * rhs.a + self.c * rhs.d - self.d * rhs.c, |
|||
self.a * rhs.c - self.b * rhs.d + self.c * rhs.a + self.d * rhs.b, |
|||
self.a * rhs.d + self.b * rhs.c - self.c * rhs.b + self.d * rhs.a) |
|||
end |
|||
def *(rhs : Int32 | Int64) |
|||
Quaternion.new(self.a * rhs, self.b * rhs, self.c * rhs, self.d * rhs) |
|||
end |
|||
def -() |
|||
Quaternion.new(-self.a, -self.b, -self.c, -self.d) |
|||
end |
|||
def ==(rhs : Quaternion) |
|||
self.to_s == rhs.to_s |
|||
end |
|||
def to_s |
|||
"(#{self.a} #{sgn(self.b)}i #{sgn(self.c)}j #{sgn(self.d)}k)\n" |
|||
end |
|||
private def sgn(n) |
|||
n.sign == 1 ? "+ #{n}" : "- #{n.abs}" |
|||
end |
|||
end |
|||
q0 = Quaternion.new(a: 1, b: 2, c: 3, d: 4) |
|||
q1 = Quaternion.new(2, 3, 4, 5) |
|||
q2 = Quaternion.new(3, 4, 5, 6) |
|||
r = 7 |
|||
puts "q0 = #{q0.to_s}" |
|||
puts "q1 = #{q1.to_s}" |
|||
puts "q2 = #{q2.to_s}" |
|||
puts "r = #{r}" |
|||
puts |
|||
puts "normal of q0 = #{q0.norm.to_s}" |
|||
puts "-q0 = #{(-q0).to_s}" |
|||
puts "conjugate of q0 = #{q0.conj.to_s}" |
|||
puts "q0 * (conjugate of q0) = #{(q0 * q0.conj).to_s}" |
|||
puts "(conjugate of q0) * q0 = #{(q0.conj * q0).to_s}" |
|||
puts |
|||
#puts "r + q0 = #{(r + q0).to_s}" |
|||
puts "q0 + r = #{(q0 + r).to_s}" |
|||
puts |
|||
#puts "r * q0 = #{(r * q0).to_s}" |
|||
puts "q0 * r = #{(q0 * r).to_s}" |
|||
puts |
|||
puts "q0 + q1 = #{(q0 + q1).to_s}" |
|||
puts "q0 - q1 = #{(q2 - q1).to_s}" |
|||
puts "q0 * q1 = #{(q0 * q1).to_s}" |
|||
puts |
|||
puts " q0 + q1 * q2 = #{(q0 + q1 * q2).to_s}" |
|||
puts "(q0 + q1) * q2 = #{((q0 + q1) * q2).to_s}" |
|||
puts |
|||
puts " q0 * q1 * q2 = #{(q0 * q1 * q2).to_s}" |
|||
puts "(q0 * q1) * q2 = #{((q0 * q1) * q2).to_s}" |
|||
puts " q0 * (q1 * q2) = #{(q0 * (q1 * q2)).to_s}" |
|||
puts |
|||
puts "q1 * q2 = #{(q1 * q2).to_s}" |
|||
puts "q2 * q1 = #{(q2 * q1).to_s}" |
|||
puts |
|||
puts "q1 * q2 != q2 * q1 => #{(q1 * q2) != (q2 * q1)}" |
|||
puts "q1 * q2 == q2 * q1 => #{(q1 * q2) == (q2 * q1)}" |
|||
</lang> |
|||
{{out}} |
|||
<pre>q0 = (1 + 2i + 3j + 4k) |
|||
q1 = (2 + 3i + 4j + 5k) |
|||
q2 = (3 + 4i + 5j + 6k) |
|||
r = 7 |
|||
normal of q0 = 5.477225575051661 |
|||
-q0 = (-1 - 2i - 3j - 4k) |
|||
conjugate of q0 = (1 - 2i - 3j - 4k) |
|||
q0 * (conjugate of q0) = (30 - 0i - 0j - 0k) |
|||
(conjugate of q0) * q0 = (30 - 0i - 0j - 0k) |
|||
q0 + r = (8 + 2i + 3j + 4k) |
|||
q0 * r = (7 + 14i + 21j + 28k) |
|||
q0 + q1 = (3 + 5i + 7j + 9k) |
|||
q0 - q1 = (1 + 1i + 1j + 1k) |
|||
q0 * q1 = (-36 + 6i + 12j + 12k) |
|||
q0 + q1 * q2 = (-55 + 18i + 27j + 30k) |
|||
(q0 + q1) * q2 = (-100 + 24i + 42j + 42k) |
|||
q0 * q1 * q2 = (-264 - 114i - 132j - 198k) |
|||
(q0 * q1) * q2 = (-264 - 114i - 132j - 198k) |
|||
q0 * (q1 * q2) = (-264 - 114i - 132j - 198k) |
|||
q1 * q2 = (-56 + 16i + 24j + 26k) |
|||
q2 * q1 = (-56 + 18i + 20j + 28k) |
|||
q1 * q2 != q2 * q1 => true |
|||
q1 * q2 == q2 * q1 => false</pre> |
|||
=={{header|D}}== |
=={{header|D}}== |