def test_eigen(self): #TODO looks like bug in eigen - (1, 0) should be eigenvector too #~ S = Scale(1, 2) #~ E_S = Eigen(S) #~ print E_S.vectors, E_S.values #~ print Affine(S) #~ for i in E_S.vectors: #~ print i, i*S, Point(1, 0) * S B = Affine(-2, 2, 2, 1, 0, 0) G1 = Eigen(B) G2 = Eigen([[-2, 2], [2, 1]]) self.assertAlmostEqual(min(G1.values), min(G2.values)) self.assertAlmostEqual(max(G1.values), max(G2.values)) if Point.are_near(G1.vectors[0] * G1.values[0], G1.vectors[0] * B): self.assertTrue( Point.are_near(G1.vectors[1] * G1.values[1], G1.vectors[1] * B)) else: self.assertTrue( Point.are_near(G1.vectors[1] * G1.values[0], G1.vectors[1] * B)) self.assertTrue( Point.are_near(G1.vectors[0] * G1.values[1], G1.vectors[0] * B))
def test_eigen(self): #TODO looks like bug in eigen - (1, 0) should be eigenvector too #~ S = Scale(1, 2) #~ E_S = Eigen(S) #~ print E_S.vectors, E_S.values #~ print Affine(S) #~ for i in E_S.vectors: #~ print i, i*S, Point(1, 0) * S B = Affine(-2, 2, 2, 1, 0, 0) G1 = Eigen(B) G2 = Eigen( [[-2, 2], [2, 1]] ) self.assertAlmostEqual(min(G1.values), min(G2.values)) self.assertAlmostEqual(max(G1.values), max(G2.values)) if Point.are_near( G1.vectors[0]*G1.values[0], G1.vectors[0]*B ): self.assertTrue( Point.are_near( G1.vectors[1]*G1.values[1], G1.vectors[1]*B ) ) else: self.assertTrue( Point.are_near( G1.vectors[1]*G1.values[0], G1.vectors[1]*B ) ) self.assertTrue( Point.are_near( G1.vectors[0]*G1.values[1], G1.vectors[0]*B ) )
def test_rotate(self): R = Rotate() S = Rotate(pi/3) T = Rotate(Point( 1, 1 )) U = Rotate( -1, 1 ) self.assertTrue(S.vector(), Point(cos(pi/3), sin(pi/3)) ) self.assertEqual( Point(T[0], T[1]), T.vector() ) self.assertTrue( Affine.are_near( Rotate.from_degrees(60), S ) ) self.assertEqual(R, Rotate.identity()) self.assertTrue( Point.are_near( ( S * T ).vector(), Point( cos( pi/3 + pi/4 ), sin( pi/3 + pi/4 ) ) ) ) self.affine( Affine(R), Affine(S)) self.affine( Affine(S), Affine(T)) self.affine( Affine(T), Affine(U)) self.affine( Affine(U), Affine(R))
def test_rotate(self): R = Rotate() S = Rotate(pi / 3) T = Rotate(Point(1, 1)) U = Rotate(-1, 1) self.assertTrue(S.vector(), Point(cos(pi / 3), sin(pi / 3))) self.assertEqual(Point(T[0], T[1]), T.vector()) self.assertTrue(Affine.are_near(Rotate.from_degrees(60), S)) self.assertEqual(R, Rotate.identity()) self.assertTrue( Point.are_near((S * T).vector(), Point(cos(pi / 3 + pi / 4), sin(pi / 3 + pi / 4)))) self.affine(Affine(R), Affine(S)) self.affine(Affine(S), Affine(T)) self.affine(Affine(T), Affine(U)) self.affine(Affine(U), Affine(R))
def test_zoom(self): Z = Zoom(3) Y = Zoom(translate=Translate(3, 2)) X = Zoom(sqrt(3), Translate(-1, 3)) self.assertEqual(Zoom(Z.scale(), Translate(Y.translation())), Y * Z) Z.set_translation(Y.translation()) Y.set_scale(Z.scale()) self.assertEqual(Z, Y) self.assertEqual(Y.inverse().scale(), 1 / Y.scale()) r = Rect.from_xywh(1, 1, 3, 6) q = Rect.from_xywh(0, -1, 1, 2) W = Zoom.map_rect(r, q) self.assertAlmostEqual(W.scale() * r.width(), q.width()) self.assertTrue(Point.are_near(r.min() + W.translation(), q.min()))
def test_zoom(self): Z = Zoom(3) Y = Zoom(translate=Translate(3,2)) X = Zoom(sqrt(3), Translate(-1, 3)) self.assertEqual( Zoom(Z.scale(), Translate(Y.translation())), Y*Z ) Z.set_translation(Y.translation()) Y.set_scale(Z.scale()) self.assertEqual(Z, Y) self.assertEqual(Y.inverse().scale(), 1/Y.scale()) r = Rect.from_xywh( 1, 1, 3, 6) q = Rect.from_xywh( 0, -1, 1, 2) W = Zoom.map_rect(r, q) self.assertAlmostEqual(W.scale()*r.width(), q.width()) self.assertTrue(Point.are_near( r.min()+W.translation(), q.min()))
def test_point(self): p = Point(3, 4) q = Point(8, 16) p_inf = Point(float('inf'), 1) #y axis points downwards p_ccw = Point(4, -3) self.assertAlmostEqual(p.length(), 5) self.assertAlmostEqual(p.ccw(), p_ccw) self.assertAlmostEqual(p_ccw.cw(), p) self.assertAlmostEqual(p[0], 3) self.assertAlmostEqual(p[1], 4) self.assertFalse(p_inf.isFinite()) self.assertTrue(p.isFinite()) self.assertFalse(p.isNormalized()) self.assertTrue((p / p.length()).isNormalized()) self.assertFalse(p.isZero()) self.assertTrue((p * 0).isZero()) self.assertTrue((p + p.ccw().ccw()).isZero) self.assertAlmostEqual((q - p).length(), 13) self.assertGreater(q, p) self.assertGreaterEqual(q, p) self.assertEqual(p, p) self.assertNotEqual(p, q) self.assertLess(Point(1, 1), Point(1, 2)) self.assertLessEqual(p, p) self.assertTrue( Point.are_near(Point.polar(pi / 4, sqrt(2)), Point(1, 1))) self.assertAlmostEqual(sqrt(2), Point.L2(Point(1, 1))) self.assertAlmostEqual(2, Point.L2sq(Point(1, 1))) self.assertAlmostEqual(Point.middle_point(Point(), q), q / 2) self.assertAlmostEqual(Point.rot90(p), p.cw()) self.assertAlmostEqual( Point.lerp(0.2, Point(), Point(3, 4)).length(), 1) self.assertAlmostEqual(Point.dot(p, p_ccw), 0) self.assertAlmostEqual(Point.dot(p, p_inf), float('inf')) self.assertAlmostEqual(Point.dot(p, q), 88) #TODO this might be implemented incorrectly in lib2geom! self.assertAlmostEqual(Point.cross(p, q), -16) self.assertAlmostEqual(Point.distance(p, q), 13) self.assertAlmostEqual(Point.distanceSq(p, p_ccw), 50) self.assertAlmostEqual(Point.unit_vector(p), p / 5) self.assertAlmostEqual(Point.L1(p), 7) self.assertAlmostEqual(Point.L1(p_inf), float('inf')) self.assertAlmostEqual(Point.LInfty(q), 16) self.assertAlmostEqual(Point.LInfty(p_inf), float('inf')) self.assertTrue(Point.is_zero(Point())) self.assertFalse(Point.is_zero(p)) self.assertTrue(Point.is_unit_vector(p / 5)) self.assertFalse(Point.is_unit_vector(q)) self.assertAlmostEqual(Point.atan2(Point(1, 1)), pi / 4) self.assertAlmostEqual(Point.angle_between(p, p_ccw), -pi / 2) self.assertAlmostEqual(Point.abs(-p), p)
def test_point(self): p = Point(3, 4) q = Point(8, 16) p_inf = Point(float('inf'), 1) #y axis points downwards p_ccw = Point(4, -3) self.assertAlmostEqual(p.length(), 5) self.assertAlmostEqual(p.ccw(), p_ccw) self.assertAlmostEqual(p_ccw.cw(), p) self.assertAlmostEqual(p[0], 3) self.assertAlmostEqual(p[1], 4) self.assertFalse(p_inf.isFinite()) self.assertTrue(p.isFinite()) self.assertFalse(p.isNormalized()) self.assertTrue((p/p.length()).isNormalized()) self.assertFalse(p.isZero()) self.assertTrue((p*0).isZero()) self.assertTrue( (p + p.ccw().ccw()).isZero) self.assertAlmostEqual( (q-p).length(), 13) self.assertGreater(q, p) self.assertGreaterEqual(q, p) self.assertEqual(p, p) self.assertNotEqual(p, q) self.assertLess( Point(1, 1), Point(1, 2) ) self.assertLessEqual(p, p) self.assertTrue( Point.are_near( Point.polar(pi/4, sqrt(2)), Point(1, 1) )) self.assertAlmostEqual(sqrt(2), Point.L2(Point(1, 1))) self.assertAlmostEqual(2, Point.L2sq(Point(1, 1))) self.assertAlmostEqual( Point.middle_point(Point(), q), q/2 ) self.assertAlmostEqual( Point.rot90(p), p.cw() ) self.assertAlmostEqual( Point.lerp(0.2, Point(), Point(3,4)).length(), 1) self.assertAlmostEqual(Point.dot(p, p_ccw), 0) self.assertAlmostEqual(Point.dot(p, p_inf), float('inf')) self.assertAlmostEqual(Point.dot(p, q), 88) #TODO this might be implemented incorrectly in lib2geom! self.assertAlmostEqual(Point.cross(p, q), -16) self.assertAlmostEqual(Point.distance(p, q), 13) self.assertAlmostEqual(Point.distanceSq(p, p_ccw), 50) self.assertAlmostEqual(Point.unit_vector(p), p/5) self.assertAlmostEqual(Point.L1(p), 7) self.assertAlmostEqual(Point.L1(p_inf), float('inf')) self.assertAlmostEqual(Point.LInfty(q), 16) self.assertAlmostEqual(Point.LInfty(p_inf), float('inf')) self.assertTrue(Point.is_zero(Point())) self.assertFalse(Point.is_zero(p)) self.assertTrue(Point.is_unit_vector(p/5)) self.assertFalse(Point.is_unit_vector(q)) self.assertAlmostEqual(Point.atan2(Point(1, 1)), pi/4) self.assertAlmostEqual(Point.angle_between(p, p_ccw), -pi/2) self.assertAlmostEqual(Point.abs(-p), p)