Quaternion type: Difference between revisions

Content added Content deleted
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}}==