def test_rotate_to(self): self.assertEqual(quat().set_rotate_axis((1, 0, 0), 90), vec3(0, 0, -1).get_rotation_to((0, 1, 0))) self.assertEqual(quat().set_rotate_axis((0, 1, 0), 90), vec3(0, 0, 1).get_rotation_to((1, 0, 0))) self.assertEqual(quat().set_rotate_axis((0, 0, 1), 90), vec3(0, 1, 0).get_rotation_to((-1, 0, 0)))
def test_setitem(self): a = vec3(0) a[0] = 1 self.assertEqual(vec3(1, 0, 0), a) a[1] = 2 self.assertEqual(vec3(1, 2, 0), a) a[2] = 3 self.assertEqual(vec3(1, 2, 3), a) with self.assertRaises(IndexError): a[3] = 1
def test_properties(self): self.assertEqual(vec3(1, 2, 3).x, 1) self.assertEqual(vec3(1, 2, 3).y, 2) self.assertEqual(vec3(1, 2, 3).z, 3) a = vec3() a.x = 5 self.assertEqual((5, 0, 0), a) a.y = 6 self.assertEqual((5, 6, 0), a) a.z = 7 self.assertEqual((5, 6, 7), a)
def test_rotate(self): self.assertEqual((mat4().rotate_x(90) * (1, 2, 3)).round(), vec3((1, -3, 2))) self.assertEqual( (mat4().rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((2, -3, -1))) self.assertEqual((mat4().rotate_z(90).rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((3, 2, -1))) self.assertEqual((mat4().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_getitem(self): a = vec3(1, 2, 3) self.assertEqual(1, a[0]) self.assertEqual(2, a[1]) self.assertEqual(3, a[2]) with self.assertRaises(IndexError): a[3]
def get_normal(self, pos, e=0.001): return vec3( self.get_distance(pos + (e, 0, 0)) - self.get_distance(pos - (e, 0, 0)), self.get_distance(pos + (0, e, 0)) - self.get_distance(pos - (0, e, 0)), self.get_distance(pos + (0, 0, e)) - self.get_distance(pos - (0, 0, e))).normalize_safe()
def test_round(self): self.assertEqual((0, 0, 1), vec3(0.49, 0.5, 0.51).round()) self.assertEqual((0, 0, -1), vec3(-0.49, -0.5, -0.51).round()) self.assertEqual((0.5, 0.5, 0.5), vec3(0.49, 0.5, 0.51).round(1)) self.assertEqual((-0.5, -0.5, -0.5), vec3(-0.49, -0.5, -0.51).round(1)) self.assertEqual((0.12346, 0.12346, 0.12341), vec3(0.123456, 0.123456789, 0.1234123456789).round(5)) self.assertEqual((0, 0, 1), vec3(0.49, 0.5, 0.51).rounded()) self.assertEqual((0, 0, -1), vec3(-0.49, -0.5, -0.51).rounded())
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_compare_rotate_vec(self): v = vec3((1, 2, 3)) self.assertAlmostEqual(mat4().rotate_x(90) * v, v.rotated_x(90)) self.assertAlmostEqual(mat4().rotate_y(90) * v, v.rotated_y(90)) self.assertAlmostEqual(mat4().rotate_z(90) * v, v.rotated_z(90)) self.assertAlmostEqual(mat4().rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90)) self.assertAlmostEqual( mat4().rotate_x(90).rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90).rotated_x(90))
def test_cross(self): self.assertEqual((0, 0, 1), vec3(1, 0, 0).cross((0, 1, 0))) self.assertEqual((0, -1, 0), vec3(1, 0, 0).cross((0, 0, 1))) self.assertEqual((1, 0, 0), vec3(0, 1, 0).cross((0, 0, 1))) self.assertEqual((0, 0, 1), vec3(1, 0, 0).crossed((0, 1, 0))) self.assertEqual((0, -1, 0), vec3(1, 0, 0).crossed((0, 0, 1))) self.assertEqual((1, 0, 0), vec3(0, 1, 0).crossed((0, 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 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_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_assignment(self): self.assertEqual("mat4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1)", str(mat4())) self.assertEqual("mat4(2,0,0,0, 0,2,0,0, 0,0,2,0, 0,0,0,2)", str(mat4(2))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str(mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str(mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str( mat4((1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12), (13, 14, 15, 16)))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str( mat4(1, vec3(2, 3, 4), 5, 6, (7, 8), (9, ), 10, 11, (12, ), 13, (14, 15), 16)))
def test_div(self): self.assertEqual(vec3(1.5), vec3(3) / vec3(2)) self.assertEqual(vec3(1.5), vec3(3) / 2) self.assertEqual(vec3(2, 1, .5), vec3(2) / (1, 2, 4)) self.assertEqual(vec3(2, 1, .5), vec3(2) / vec3((1, 2, 4))) self.assertEqual(vec3(1.5), 3 / vec3(2)) self.assertEqual(vec3(.5, 1, 1.5), (1, 2, 3) / vec3(2)) a = vec3(8) a /= 2 self.assertEqual(vec3(4), a) a /= [1, 2, 4] self.assertEqual(vec3((4, 2, 1)), a)
def test_iter(self): self.assertEqual([1, 2, 3], [x for x in vec3(1, 2, 3)])
def test_abs(self): self.assertEqual(vec3(1, 2, 3), abs(vec3(-1, -2, -3))) self.assertEqual(vec3(1, 2, 3), abs(vec3(1, -2, 3)))
def test_floor(self): self.assertEqual(vec3(1, 2, 3), vec3(1.4, 2.5, 3.6).floor()) self.assertEqual(vec3(-2, -3, -4), vec3(-1.4, -2.5, -3.6).floor()) self.assertEqual(vec3(1, 2, 3), vec3(1.4, 2.5, 3.6).floored()) self.assertEqual(vec3(-2, -3, -4), vec3(-1.4, -2.5, -3.6).floored())
def test_mat4_x_vec3(self): self.assertEqual(mat4(1) * (1, 2, 3), vec3(1, 2, 3)) self.assertEqual(mat4(2) * (1, 2, 3), vec3(2, 4, 6))
def test_add(self): self.assertEqual(vec3(3), vec3(1) + 2) self.assertEqual(vec3(3), vec3(1) + vec3(2)) self.assertEqual(vec3(3, 5, 7), vec3(1, 2, 3) + vec3(2, 3, 4)) self.assertEqual(vec3(3), vec3(1) + vec3(2)) self.assertEqual(vec3(2, 3, 4), vec3(1) + [1, 2, 3]) self.assertEqual(vec3(2, 3, 4), vec3(1) + ["1", "2", "3"]) self.assertEqual(vec3(3), 2 + vec3(1)) self.assertEqual(vec3(3), "2" + vec3(1)) self.assertEqual(vec3(2, 3, 4), [1, 2, 3] + vec3(1)) self.assertEqual(vec3(2, 3, 4), ["1", "2", "3"] + vec3(1)) with self.assertRaises(TypeError): vec3() + [1, 2] a = vec3(1) a += 1 self.assertEqual(vec3(2), a) a += [1, 2, 3] self.assertEqual(vec3(3, 4, 5), a)
def test_rotated(self): self.assertEqual(vec3(1, -3, 2), vec3(1, 2, 3).rotated_x(90).rounded()) self.assertEqual(vec3(3, 2, -1), vec3(1, 2, 3).rotated_y(90).rounded()) self.assertEqual(vec3(-2, 1, 3), vec3(1, 2, 3).rotated_z(90).rounded()) self.assertEqual(vec3(3, 2, -1), vec3(2, -3, -1).rotated_z(90).rounded()) self.assertEqual(vec3(1, -3, 2), vec3(1, 2, 3).rotated_axis((1, 0, 0), 90).rounded()) self.assertEqual(vec3(3, 2, -1), vec3(1, 2, 3).rotated_axis((0, 1, 0), 90).rounded()) self.assertEqual(vec3(-2, 1, 3), vec3(1, 2, 3).rotated_axis((0, 0, 1), 90).rounded()) self.assertEqual(vec3(2, -3, -1), vec3(1, 2, 3).rotated_x(90).rotated_y(90).rounded()) self.assertEqual( vec3(3, 2, -1), vec3(1, 2, 3).rotated_x(90).rotated_y(90).rotated_z(90).rounded()) self.assertEqual( vec3(3, 2, -1), vec3(1, 2, 3).rotated_axis((1, 0, 0), 90).rotated_axis( (0, 1, 0), 90).rotated_axis((0, 0, 1), 90).rounded())
def test_sub(self): self.assertEqual(vec3(1), vec3(3) - vec3(2)) self.assertEqual(vec3(1), vec3(3) - 2) self.assertEqual(vec3(2, 1, 0), vec3(3) - (1, 2, 3)) self.assertEqual(vec3(1), 3 - vec3(2)) self.assertEqual(vec3(-1, 0, 1), (1, 2, 3) - vec3(2)) a = vec3(1) a -= 2 self.assertEqual(vec3(-1), a) a -= [1, 2, 3] self.assertEqual(vec3((-2, -3, -4)), a)
def test_equal(self): self.assertTrue(vec3(1) == vec3(1)) self.assertFalse(vec3(1) == vec3(2)) self.assertTrue(vec3(1) == (1, 1, 1)) self.assertFalse(vec3(1) == (1, 1))
def pos_to_local(self, pos): return self._itransform * pos if self.has_transform else vec3(pos)
def test_mul(self): self.assertEqual(vec3(6), vec3(2) * vec3(3)) self.assertEqual(vec3(6), vec3(2) * 3) self.assertEqual(vec3(2, 4, 6), vec3(2) * (1, 2, 3)) self.assertEqual(vec3(2, 4, 6), vec3(2) * vec3(1, 2, 3)) self.assertEqual(vec3(6), 2 * vec3(3)) self.assertEqual(vec3(3, 6, 9), (1, 2, 3) * vec3(3)) a = vec3(1) a *= 2 self.assertEqual(vec3(2), a) a *= [1, 2, 3] self.assertEqual(vec3(2, 4, 6), a)
def test_rotate_to_mat(self): cur = vec3(0, 1, 0) goal = vec3(1, 0, 0) v = cur.get_rotation_to(goal).as_mat3() * cur self.assertEqual(goal.rounded(3), v.rounded(3))
def test_mod(self): self.assertEqual(vec3(1, 0, 1), vec3(1, 2, 3) % 2) self.assertEqual(vec3(1, 2, .5), vec3(1, 2, 3) % 2.5)
def test_dot(self): self.assertEqual(32, vec3(1, 2, 3).dot((4, 5, 6))) with self.assertRaises(TypeError): vec3().dot((1, 2))
def test_assignment(self): self.assertEqual( "vec3(0, 0, 0)", str(vec3()), ) self.assertEqual("vec3(1, 1, 1)", str(vec3(1))) self.assertEqual("vec3(5, 5, 5)", str(vec3("5"))) self.assertEqual("vec3(1, 2, 0)", str(vec3(1, 2))) self.assertEqual("vec3(1, 2, 3)", str(vec3(1, 2, 3))) self.assertEqual("vec3(1, 2, 3)", str(vec3("1", "2", "3"))) self.assertEqual("vec3(1, 0, 0)", str(vec3((1, )))) self.assertEqual("vec3(1, 2, 0)", str(vec3((1, 2)))) self.assertEqual("vec3(1, 2, 3)", str(vec3((1, 2, 3)))) self.assertEqual("vec3(1, 2, 3)", str(vec3((1, 2), 3))) self.assertEqual("vec3(1, 2, 3)", str(vec3(1, (2, 3)))) self.assertEqual("vec3(1, 2, 3)", str(vec3(1, (2, ), 3))) self.assertEqual("vec3(1, 2, 3)", str(vec3(("1", "2", "3")))) with self.assertRaises(ValueError): vec3(1, 2, 3, 4) with self.assertRaises(ValueError): vec3((1, 2, 3, 4)) with self.assertRaises(TypeError): vec3("bla") with self.assertRaises(TypeError): vec3({"x": 23}) self.assertEqual(str(vec3([1])), "vec3(1, 0, 0)") self.assertEqual(str(vec3([1, 2])), "vec3(1, 2, 0)")