def test_inverse_trans(): t = m3d.Transform() t.pos.x = 1 t.orient.rotate_zb(np.pi / 2) t.orient.rotate_yb(np.pi / 2) v = m3d.Vector(2, 0, 0) assert t * v == m3d.Vector(1, 2, 0)
def test_rotation_t(): t = m3d.Transform() t.pos.x = 1 t.orient.rotate_zt(np.pi / 2) t.orient.rotate_yt(np.pi / 2) v = m3d.Vector(2, 0, 0) assert t * v == m3d.Vector(1, 0, -2)
def test_transform(): t = m3d.Transform() t.orient.rotate_zb(np.pi / 2) t.pos.y = 2 v = m3d.Vector(1, 0, 0) r = t * v assert r == m3d.Vector(0, 3, 0)
def test_vect_div(): v1 = m3d.Vector(10, 10, 10) const_val = 2 const_val_2 = -5 v_res = v1 / const_val v_res_2 = v1 / const_val_2 assert v_res == m3d.Vector(5, 5, 5) assert v_res_2 == m3d.Vector(-2, -2, -2)
def test_vector_dot(): d1 = np.array([1, 2, -3]) d2 = np.array([2, 2, 2]) v1 = m3d.Vector(d1) v2 = m3d.Vector(d2) assert np.dot(d1, d2) == v1.dot(v2) assert v1.dot(v2) == v1 @ v2 assert v1 @ v1 == v1.length**2
def test_vector_except(): with pytest.raises(ValueError): o = m3d.Vector(np.identity(4)) with pytest.raises(ValueError): o = m3d.Vector("whatever") with pytest.raises(ValueError): o = m3d.Vector([1, 2, 3, 4]) o = m3d.Vector([1, 2, 3])
def test_vect_mul(): v1 = m3d.Vector(10, 10, 10) const_val = 2 const_val_2 = -5 v_res = v1 * const_val v_res_2 = v1 * const_val_2 assert v_res == m3d.Vector(20, 20, 20) assert v_res_2 == m3d.Vector(-50, -50, -50)
def test_multiplication_orient(): o = m3d.Orientation() o.rotate_zb(np.pi / 2) v = m3d.Vector(1, 0, 0) r = o * v assert r == m3d.Vector(0, 1, 0) o.rotate_zb(-np.pi) v = m3d.Vector(2, 0, 0) r = o * v assert r == m3d.Vector(0, -2, 0)
def test_unit_vectors(): assert m3d.vector.e0 == m3d.Vector(1, 0, 0) assert m3d.vector.e1 == m3d.Vector(0, 1, 0) assert m3d.vector.e2 == m3d.Vector(0, 0, 1) t = m3d.Transform() assert m3d.vector.ex == t.orient.vec_x assert m3d.vector.ey == t.orient.vec_y assert m3d.vector.ez == t.orient.vec_z t.orient.rotate_zb(1) assert m3d.vector.ex != t.orient.vec_x assert m3d.vector.ey != t.orient.vec_y assert m3d.vector.ez == t.orient.vec_z
def test_construct(): o = m3d.Orientation() o.rotate_zb(1) v = m3d.Vector() v[0] = 1 v[2] = 2 t = m3d.Transform(o, v) assert t.pos.x == 1 assert t.pos.z == 2 t.pos = m3d.Vector() t.orient.rotate_zb(-1) assert t == m3d.Transform() t.orient = o assert t != m3d.Transform()
def test_from_xz(): x = m3d.Vector(1, 0, 0) z = m3d.Vector(0, 0, 1) orient = m3d.Orientation.from_xz(x, z) assert _are_equals(orient.data, np.identity(3)) x = m3d.Vector(2, 0, 0.1) z = m3d.Vector(0.1, -0.1, 3) o = m3d.Orientation() o.rotate_yb(1) o.rotate_zb(1) x = o @ x z = o @ z orient = m3d.Orientation.from_xz(x, z) assert _are_equals(o, orient, eps=0.1)
def test_vector_project(): v1 = m3d.Vector(1, 1, 1) v2 = m3d.Vector(2, 2, 2) vx = m3d.Vector(1, 0, 0) vy = m3d.Vector(0, 1, 0) vz = m3d.Vector(0, 0, 1) assert v1.project(vx) == vx assert v1.project(vy) == vy assert v1.project(vz) == vz assert v1.project(v2) == v1 assert v2.project(v1) == v2
def test_vector_angle(): v1 = m3d.Vector(1, 1, 1) v2 = m3d.Vector(2, 2, 2) vx = m3d.Vector(1, 0, 0) vy = m3d.Vector(0, 1, 0) vz = m3d.Vector(0, 0, 1) assert vx.angle(vx) == 0 assert vx.angle(vy) == np.pi / 2 assert vx.angle(vz) == np.pi / 2 assert v1.angle(v2) == 0 assert v2.angle(v1) == 0
def test_eq(): t = m3d.Transform() t.orient.rotate_yb(1) t.orient.rotate_zb(1) t.pos.x = 1 v = m3d.Vector() o = m3d.Orientation() with pytest.raises(ValueError): assert t != v with pytest.raises(ValueError): assert v != t with pytest.raises(ValueError): assert o != v t2 = t.copy() assert t == t2 assert t.pos == t2.pos assert t.orient == t2.orient t2.pos.y = 2 assert t != t2 assert t.pos != t2.pos assert t.orient == t2.orient t3 = t.copy() t3.orient.rotate_xb(1) assert t2.pos != t3.pos assert t2.orient != t3.orient assert t != t3
def test_transform_init_ref(): v = m3d.Vector(1, 2, 3) o = m3d.Orientation() o.rotate_zb(1) t = m3d.Transform(o, v) assert t.orient == o o.rotate_xb(1) assert t.orient != o
def test_from_axis_angle(): axis_tuple = (1, 2, 3) axis_normalized = m3d.Vector(axis_tuple).normalized() angle = 10 o1 = m3d.Orientation.from_axis_angle(axis_tuple, angle) o2 = m3d.Orientation.from_axis_angle(axis_normalized, angle) assert o1.similar(o2, CONVERTION_ERROR)
def test_rotation(): t = m3d.Transform() t.pos.x = 1 t.orient.rotate_yb(1) res = m3d.Transform( m3d.Orientation([[0.54030228, 0, 0.84147096], [0., 1, 0.], [-0.84147096, 0., 0.54030228]]), m3d.Vector(1, 0, 0)) assert _are_equals(res.data, t.data)
def test_inverse_orient(): o = m3d.Orientation() o.rotate_xb(3) o.rotate_yb(1) o.rotate_xb(1) v = m3d.Vector(-1, -2, -3) assert o * v != v assert o.inverse() * o * v == v assert o * o.inverse() * v == v assert o * o.inverse() * o == o
def test_init(): t = m3d.Transform() assert t.pos.x == 0 assert t.pos.y == 0 t.pos.x = 2 assert t.pos.x == 2 i = t.inverse() assert m3d.Vector(-2, 0, 0) == i.pos assert m3d.Orientation() == i.orient
def test_inverse_2(): t = m3d.Transform() t.pos.x = 1 t.pos.z = 3 t.orient.rotate_yb(1) t.orient.rotate_zb(1) v = m3d.Vector(2, 3, 4) assert v != t * v assert v == t.inverse() * t * v assert v == t * t.inverse() * v assert v != t @ v assert v == t.inverse() @ t @ v assert v == t @ t.inverse() @ v
def test_rotation_seq_2(): t = m3d.Transform() t.pos.x = 1 t.pos.z = 3 t.orient.rotate_xb(1) t.orient.rotate_yb(2) t.orient.rotate_zb(3) b = m3d.Transform() b.orient.rotate_zb(-3) b.orient.rotate_yb(-2) b.orient.rotate_xb(-1) b.pos = b.orient * m3d.Vector(1, 0, 3) * -1 assert _are_equals(t.inverse().data, b.data)
def test_transform_init(): v = m3d.Vector(1, 2, 3) o = m3d.Orientation() o.rotate_zb(1) t = m3d.Transform(o, v) assert t.pos == v assert t.orient == o t2 = m3d.Transform(o.data, v.data) assert t2.pos == v assert t2.orient == o assert t == t2 with pytest.raises(ValueError): m3d.Transform(np.array([1, 2, 3]), np.array([1, 2, 3])) with pytest.raises(ValueError): m3d.Transform(o.data, np.array([1, 2]))
def test_inverse(): t1 = m3d.Transform() t1.orient.rotate_xb(np.pi / 3) t1.pos.x = 1 t2 = m3d.Transform() t2.orient.rotate_xb(-13 * np.pi / 6) t2.pos.x = 2.3 v = m3d.Vector(0.1, -4.5, 3.0) tr = m3d.Transform() tr.orient.rotate_xb(np.pi) tr.pos.x = 3 assert (t1 * t1.inverse()) == m3d.Transform(matrix=np.identity(4)) assert (t1 * t1.inverse()) == m3d.Transform() assert (t2 * t2.inverse()) == m3d.Transform(matrix=np.identity(4)) assert (t2 * t2.inverse()) == m3d.Transform() assert (t1 * t2 * t1.inverse() * t2.inverse()).similar( m3d.Transform(matrix=np.identity(4)), CONVERTION_ERROR) assert t1.inverse() * (t1 * v) == v
def test_mult_trans(): t1 = m3d.Transform() t1.orient.rotate_xb(np.pi / 2) t1.pos.x = 1 t2 = m3d.Transform() t2.orient.rotate_xb(np.pi / 2) t2.pos.x = 2 v = m3d.Vector(0, 0, 3) tr = m3d.Transform() tr.orient.rotate_xb(np.pi) tr.pos.x = 3 tm = math3d.Transform() tm.orient.rotate_xb(np.pi / 2) tm.pos.x = 2 vm = math3d.Vector(0, 0, 3) assert t1 * t2 * v == tr * v assert t1 @ t2 @ v == tr @ v assert _are_equals((t2 * v).data, (tm * vm)._data)
def test_vector_angle_perp(): v1 = m3d.Vector(1, 0, 0) v2 = m3d.Vector(1, 1, 0) v3 = m3d.Vector(1, -1, 0) vx = m3d.Vector(1, 0, 0) vy = m3d.Vector(0, 1, 0) vz = m3d.Vector(0, 0, 1) assert vx.angle(vx, vz) == 0 assert vx.angle(vy, vz) == np.pi / 2 assert vx.angle(vz, vy) == -np.pi / 2 # Flip nominal direction for perpendicular vector assert vx.angle(vx, -vz) == 0 assert vx.angle(vy, -vz) == -np.pi / 2 assert vx.angle(vz, -vy) == np.pi / 2 assert v1.angle(v2, vz) == -v1.angle(v2, -vz) assert v1.angle(v2, vz) == v1.angle(v3, -vz)
def test_dist(): v1 = m3d.Vector(1, 1, 1) v2 = m3d.Vector(2, 2, 2) v_res = v2.dist(v1) assert v_res == m3d.Vector(1, 1, 1).length
def test_trans_init_except(): with pytest.raises(ValueError): o = m3d.Vector(np.identity(5))
def test_norm(): v = m3d.Vector(1, 2, 3) v.normalize() assert abs(v.length - 1) <= m3d.float_eps
def test_from_xy(): x = m3d.Vector(1, 0, 0) y = m3d.Vector(0.01, 2.1, 0) orient = m3d.Orientation.from_xy(x, y) assert _are_equals(orient.data, np.identity(3), eps=0.1)
def test_from_yz(): y = m3d.Vector(0, 1, 0) z = m3d.Vector(0, 0.01, 0.1) orient = m3d.Orientation.from_yz(y, z) assert _are_equals(orient.data, np.identity(3), eps=0.1)