def test_mat3_x_mat3(self): self.assertEqual( mat3(1 * 1 + 4 * 1 + 7 * 1, 2 * 1 + 5 * 1 + 8 * 1, 3 * 1 + 6 * 1 + 9 * 1, 1 * 2 + 4 * 2 + 7 * 2, 2 * 2 + 5 * 2 + 8 * 2, 3 * 2 + 6 * 2 + 9 * 2, 1 * 3 + 4 * 3 + 7 * 3, 2 * 3 + 5 * 3 + 8 * 3, 3 * 3 + 6 * 3 + 9 * 3), mat3(1, 2, 3, 4, 5, 6, 7, 8, 9) * mat3(1, 1, 1, 2, 2, 2, 3, 3, 3))
def _compare_mat3_quat_rotation(self, axis, deg): self.assertEqual(mat3().set_rotate_axis(axis, deg).round(4), quat().set_rotate_axis(axis, deg).as_mat3().round(4)) self.assertEqual(mat3().set_rotate_axis(axis, deg).round(4), (mat3() * quat().set_rotate_axis(axis, deg)).round(4)) self.assertEqual( mat3().set_rotate_axis(axis, deg).rotate_axis(axis, deg).round(4), (mat3() * quat().set_rotate_axis(axis, deg).rotate_axis( axis, deg)).round(4))
def test_compare_rotate_vec(self): v = vec3((1, 2, 3)) self.assertAlmostEqual(mat3().rotate_x(90) * v, v.rotated_x(90)) self.assertAlmostEqual(mat3().rotate_y(90) * v, v.rotated_y(90)) self.assertAlmostEqual(mat3().rotate_z(90) * v, v.rotated_z(90)) self.assertAlmostEqual(mat3().rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90)) self.assertAlmostEqual( mat3().rotate_x(90).rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90).rotated_x(90))
def test_rotate(self): self.assertEqual((mat3().rotate_x(90) * (1, 2, 3)).round(), vec3((1, -3, 2))) self.assertEqual( (mat3().rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((2, -3, -1))) self.assertEqual((mat3().rotate_z(90).rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((3, 2, -1))) self.assertEqual((mat3().rotate_axis((0, 0, 1), 90).rotate_axis( (0, 1, 0), 90).rotate_axis((1, 0, 0), 90) * (1, 2, 3)).round(), vec3((3, 2, -1)))
def test_rotate(self): self.assertEqual(quat().set_rotate_axis((1, 2, 3), 4), quat((1, 2, 3), 4)) self.assertEqual( mat3().set_rotate_axis((1, 0, 0), 0).round(), quat().set_rotate_axis((1, 0, 0), 0).as_mat3().round()) self.assertEqual( mat3().set_rotate_axis((1, 0, 0), 90).round(), quat().set_rotate_axis((1, 0, 0), 90).as_mat3().round()) for i in range(100): axis = vec3(self.r.gauss(0, 1), self.r.gauss(0, 1), self.r.gauss(0, 1)).normalize() deg = self.r.uniform(-360, 360) self._compare_mat3_quat_rotation(axis, deg)
def test_copy_vs_inplace(self): m = mat3() m += 1 self.assertEqual(mat3() + 1, m) m = mat3() m -= 1 self.assertEqual(mat3() - 1, m) m = mat3() m *= 2 self.assertEqual(mat3() * 2, m) m = mat3() m /= 2 self.assertEqual(mat3() / 2, m) m = mat3(1.5) m %= 1 self.assertEqual(mat3(1.5) % 1, m)
def test_scalar_aritm_inpl(self): a = mat3(1) a += 1 self.assertEqual(a, mat3((2, 1, 1, 1, 2, 1, 1, 1, 2))) a = mat3(1) a *= 3 self.assertEqual(a, mat3(3)) a = mat3(2) a -= 1 self.assertEqual(a, mat3((1, -1, -1, -1, 1, -1, -1, -1, 1))) a = mat3(2) a /= 4 self.assertEqual(a, mat3(.5))
def test_transpose(self): self.assertEqual(mat3((1, 4, 7, 2, 5, 8, 3, 6, 9)), mat3((1, 2, 3, 4, 5, 6, 7, 8, 9)).transpose()) self.assertEqual(mat3((1, 4, 7, 2, 5, 8, 3, 6, 9)), mat3((1, 2, 3, 4, 5, 6, 7, 8, 9)).transposed()) self.assertEqual( mat3((1, 2, 3, 4, 5, 6, 7, 8, 9)), mat3((1, 2, 3, 4, 5, 6, 7, 8, 9)).transposed().transposed())
def test_assignment(self): self.assertEqual("mat3(1,0,0, 0,1,0, 0,0,1)", str(mat3())) self.assertEqual("mat3(2,0,0, 0,2,0, 0,0,2)", str(mat3(2))) self.assertEqual("mat3(1,2,3, 4,5,6, 7,8,9)", str(mat3(1, 2, 3, 4, 5, 6, 7, 8, 9))) self.assertEqual("mat3(1,2,3, 4,5,6, 7,8,9)", str(mat3((1, 2, 3, 4, 5, 6, 7, 8, 9)))) self.assertEqual("mat3(1,2,3, 4,5,6, 7,8,9)", str(mat3((1, 2, 3), (4, 5, 6), (7, 8, 9)))) self.assertEqual("mat3(1,2,3, 4,5,6, 7,8,9)", str(mat3(vec3(1, 2, 3), 4, (5, 6), 7, (8, ), 9)))
def test_mat_conversion_concat(self): for i in range(100): q = quat() m = mat3() # TODO: more than one transform is way off for j in range(1): axis = vec3(self.r.gauss(0, 1), self.r.gauss(0, 1), self.r.gauss(0, 1)).normalize() deg = self.r.uniform(-180 / 5, 180 / 5) q.rotate_axis(axis, deg) m.rotate_axis(axis, deg) qm = q.as_mat3().round(3) mm = m.rounded(3) diff = abs(sum(qm - mm)) if diff > .1: self.assertEqual(qm, mm) self.assertLess(diff, 0.1)
def test_mat_conversion(self): self.assertEqual(quat(), mat3().as_quat()) self._compare_quat_mat(quat((1, 0, 0), 90), mat3().set_rotate_x(90.)) self._compare_quat_mat(quat((0, 1, 0), 90), mat3().set_rotate_y(90.)) self._compare_quat_mat(quat((0, 0, 1), 90), mat3().set_rotate_z(90.)) for i in range(100): axis = vec3(self.r.gauss(0, 1), self.r.gauss(0, 1), self.r.gauss(0, 1)).normalize() deg = self.r.uniform(-119, 119) self._compare_quat_mat(quat(axis, deg), mat3().set_rotate_axis(axis, deg)) self._compare_quat_mat(quat(-axis, deg), mat3().set_rotate_axis(-axis, deg))
def as_mat3(self): from pector import mat3 """ Returns a 3x3 rotation matrix from the quaternion. :return: mat3 """ x = self.x + self.x y = self.y + self.y z = self.z + self.z wx = x * self.w wy = y * self.w wz = z * self.w xx = x * self.x xy = y * self.x xz = z * self.x yy = y * self.y yz = z * self.y zz = z * self.z m = mat3(1.0 - (yy + zz), xy + wz, xz - wy, xy - wz, 1.0 - (xx + zz), yz + wx, xz + wy, yz - wx, 1.0 - (xx + yy)) return m
def test_equal(self): self.assertEqual(mat3(1), (1, 0, 0, 0, 1, 0, 0, 0, 1))
def test_scalar_aritm(self): self.assertEqual(mat3(1) + 1, mat3((2, 1, 1, 1, 2, 1, 1, 1, 2))) self.assertEqual(mat3(1) * 3, mat3(3)) self.assertEqual(mat3(2) - 1, mat3((1, -1, -1, -1, 1, -1, -1, -1, 1))) self.assertEqual(mat3(2) / 4, mat3(.5))
def test_mat4_mat3_conversion(self): self.assertEqual(mat4(1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 1), mat4(mat3(1, 2, 3, 4, 5, 6, 7, 8, 9))) self.assertEqual( mat3(1, 2, 3, 5, 6, 7, 9, 10, 11), mat3(mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)))
def test_as_list(self): self.assertEqual([[1, 2, 3], [4, 5, 6], [7, 8, 9]], mat3(1, 2, 3, 4, 5, 6, 7, 8, 9).as_list_list()) self.assertEqual([[1, 4, 7], [2, 5, 8], [3, 6, 9]], mat3(1, 2, 3, 4, 5, 6, 7, 8, 9).as_list_list(row_major=True))
def test_trace(self): self.assertEqual(15, mat3(1, 2, 3, 4, 5, 6, 7, 8, 9).trace())
def test_scale(self): self.assertEqual((mat3().init_scale(2) * (1, 2, 3)), (2, 4, 6)) self.assertEqual((mat3().scale(2) * (1, 2, 3)), (2, 4, 6)) self.assertEqual((mat3().scale(2).scale(2) * (1, 2, 3)), (4, 8, 12)) self.assertEqual((mat3().scale(10).init_scale(2) * (1, 2, 3)), (2, 4, 6))
def test_mat3_x_vec3(self): self.assertEqual(mat3(1) * (1, 2, 3), vec3(1, 2, 3)) self.assertEqual(mat3(2) * (1, 2, 3), vec3(2, 4, 6))
def test_floor(self): self.assertEqual(mat3(1), mat3(1.4).floor()) self.assertEqual(mat3(1), mat3(1.5).floor()) self.assertEqual(mat3(1), mat3(1.6).floor()) self.assertEqual(mat3(-2), mat3(-1.4).floor()) self.assertEqual(mat3(-2), mat3(-1.5).floor()) self.assertEqual(mat3(-2), mat3(-1.6).floor())
def test_round(self): self.assertEqual(mat3(0), mat3(0.49).round()) self.assertEqual(mat3(0), mat3(0.5).round()) self.assertEqual(mat3(1), mat3(0.51).round()) self.assertEqual(mat3(0), mat3(-0.49).round()) self.assertEqual(mat3(0), mat3(-0.5).round()) self.assertEqual(mat3(-1), mat3(-0.51).round()) self.assertEqual(mat3(0.5), mat3(0.49).round(1)) self.assertEqual(mat3(0.5), mat3(0.5).round(1)) self.assertEqual(mat3(0.5), mat3(0.51).round(1)) self.assertEqual(mat3(-0.5), mat3(-0.49).round(1)) self.assertEqual(mat3(-0.5), mat3(-0.5).round(1)) self.assertEqual(mat3(-0.5), mat3(-0.51).round(1))
def test_dot(self): m = mat3(1, 2, 3, 4, 5, 6, 7, 8, 9) self.assertEqual( 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5 + 6 * 6 + 7 * 7 + 8 * 8 + 9 * 9, m.dot(m))
def test_modulo(self): self.assertEqual(mat3(1, 2, 3, 0, 1, 2, 3, 0, 1), mat3(1, 2, 3, 4, 5, 6, 7, 8, 9) % 4) self.assertEqual(mat3(3, 2, 1, 0, 3, 2, 1, 0, 3), mat3(-1, -2, -3, -4, -5, -6, -7, -8, -9) % 4)
def test_aritm(self): self.assertEqual(mat3(3), mat3(1) + mat3(2)) self.assertEqual(mat3(1), mat3(2) - mat3(1))
def test_has_rotation(self): self.assertFalse(mat3(1).has_rotation()) self.assertFalse(mat3(1).scale((1, 2, 3)).has_rotation()) self.assertTrue(mat3(1).rotate_x(0.01).has_rotation())