RoboidControl-python/test/Quaternion_test.py
2025-03-31 12:20:52 +02:00

105 lines
3.1 KiB
Python

import unittest
from LinearAlgebra.Quaternion import *
class QuaternionTest(unittest.TestCase):
def test_Equality(self):
q1 = Quaternion.identity
q2 = Quaternion(1, 0, 0, 0)
assert(q1 != q2)
q2 = Quaternion(0, 0, 0, 1)
assert(q1 == q2)
def test_FromAngles(self):
q = Quaternion.FromAngles(Angle.zero, Angle.zero, Angle.zero)
assert(q == Quaternion.identity)
q = Quaternion.FromAngles(Angle.Degrees(90), Angle.Degrees(90), Angle.Degrees(-90))
sqrt2_2 = math.sqrt(2) / 2
assert(Quaternion.isclose(q, Quaternion(0, sqrt2_2, -sqrt2_2, 0)))
def test_ToAngles(self):
q1 = Quaternion.identity
angles = Quaternion.ToAngles(q1)
assert(angles == (Angle.zero, Angle.zero, Angle.zero))
q1 = Quaternion(1, 0, 0, 0)
angles = Quaternion.ToAngles(q1)
assert(angles == (Angle.zero, Angle.Degrees(180), Angle.zero))
def test_Degrees(self):
q = Quaternion.Degrees(0, 0, 0)
assert(q == Quaternion.identity)
q = Quaternion.Degrees(90, 90, -90)
sqrt2_2 = math.sqrt(2) / 2
assert(Quaternion.isclose(q, Quaternion(0, sqrt2_2, -sqrt2_2, 0)))
# assert(q == Quaternion(0, sqrt2_2, -sqrt2_2, 0))
def test_Radians(self):
q = Quaternion.Radians(0, 0, 0)
assert(q == Quaternion.identity)
q = Quaternion.Radians(math.pi / 2, math.pi / 2, -math.pi / 2)
sqrt2_2 = math.sqrt(2) / 2
assert(Quaternion.isclose(q, Quaternion(0, sqrt2_2, -sqrt2_2, 0)))
# assert(q == Quaternion(0, sqrt2_2, -sqrt2_2, 0))
def test_Multiply(self):
q1 = Quaternion.identity
q2 = Quaternion(1, 0, 0, 0)
r = q1 * q2;
assert(r == Quaternion(1, 0, 0, 0))
def test_MultiplyVector(self):
v1 = Vector3.up
q1 = Quaternion.identity
v = q1 * v1
assert(v == Vector3(0, 1, 0))
q1 = Quaternion(1, 0, 0, 0)
v = q1 * v1
assert(v == Vector3(0, -1, 0))
def test_Angle(self):
q1 = Quaternion.identity
q2 = Quaternion.identity
r = Quaternion.Angle(q1, q2)
assert(r == Angle.zero)
def test_AngleAround(self):
axis = Direction.up
q1 = Quaternion.identity
angle = q1.AngleAround(axis)
assert(angle == Angle.Degrees(0))
sqrt2_2 = math.sqrt(2) / 2
q1 = Quaternion(0, sqrt2_2, -sqrt2_2, 0)
angle = q1.AngleAround(axis)
assert(angle == Angle.Degrees(180))
axis = Direction.zero
angle = q1.AngleAround(axis)
assert(math.isnan(angle.InDegrees()))
def test_RotationAround(self):
axis = Direction.up
q1 = Quaternion.identity
q = q1.RotationAround(axis)
assert(q == Quaternion.identity)
sqrt2_2 = math.sqrt(2) / 2
q1 = Quaternion(0, sqrt2_2, -sqrt2_2, 0)
q = q1.RotationAround(axis)
assert(q == Quaternion(0, 1, 0, 0))
axis = Direction.zero
q = q1.RotationAround(axis);
assert(math.isnan(q.x) and math.isnan(q.y) and math.isnan(q.z) and math.isnan(q.w))