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_rect(self): P = Rect(0.298, 2, 4, 5) self.interval_basic(P[0], P[1]) G = Rect(sqrt(2), sqrt(2), sqrt(3), sqrt(3)) H = Rect.from_xywh(3.43232, 9.23214, 21.523, -0.31232) self.rect_basic(P, G) self.rect_basic(G, H) lst = [Point(randint(-100, 100), randint(-100, 100)) for i in range(10)] R = Rect.from_list(lst) for p in lst: self.assertTrue(R.contains(p)) self.assertAlmostEqual(min(lst).y, R.min().y) self.assertAlmostEqual(max(lst).y, R.max().y)
def test_optRect(self): P = OptRect(0.298, 2, 4, 5) self.interval_basic(P.Rect[0], P.Rect[1]) G = Rect(sqrt(2), sqrt(2), sqrt(3), sqrt(3)) H = OptRect.from_rect(G) self.rect_basic(P.Rect, G) lst = [Point(randint(-100, 100), randint(-100, 100)) for i in range(10)] R = OptRect.from_list(lst) for p in lst: self.assertTrue(R.Rect.contains(p)) self.assertAlmostEqual(min(lst).y, R.Rect.min().y) self.assertAlmostEqual(max(lst).y, R.Rect.max().y) Q = OptRect() self.assertFalse(Q) self.assertTrue(P) self.assertTrue(Q.is_empty()) self.assertFalse(P.is_empty()) self.assertTrue(P.contains_rect( P )) self.assertTrue(P.contains_rect(Q)) self.assertFalse(Q.contains_rect(P)) self.assertFalse(P.intersects(Q)) self.assertTrue(P.contains_rect(P.Rect)) self.assertTrue(P.contains(P.Rect.midpoint())) self.assertEqual(P, OptRect.from_rect(P)) P.union_with(G) P.union_with(H) self.assertTrue(P.contains_rect(H)) P.intersect_with(G) self.assertEqual(P, G) self.assertEqual( P|H, G ) self.assertEqual( (P|R).Rect.min().x , min( P.Rect.min().x, R.Rect.min().x )) self.assertFalse(P & Q) self.assertEqual(P, P&P) self.assertEqual( P & (R | H), (P & R) | (P & H) )
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_translate(self): T = Translate() U = Translate(Point(2, 4)) V = Translate(1, -9) self.assertTrue(Affine(T).is_translation()) self.assertTrue(Affine(U).is_nonzero_translation()) self.assertEqual( (U*V).vector(), U.vector()+V.vector() ) self.assertEqual( U.inverse().vector(), -U.vector() ) self.assertEqual(T, Translate.identity()) self.assertEqual( U.vector(), Point(U[0], U[1]) ) self.affine(Affine(V), Affine(U)) self.affine(Affine(U), Affine(V)) r = Rect.from_points( Point(0, 2), Point(4, 8) ) self.assertEqual( ( r*(U*V) ).min(), r.min()+U.vector()+V.vector())
def test_translate(self): T = Translate() U = Translate(Point(2, 4)) V = Translate(1, -9) self.assertTrue(Affine(T).is_translation()) self.assertTrue(Affine(U).is_nonzero_translation()) self.assertEqual((U * V).vector(), U.vector() + V.vector()) self.assertEqual(U.inverse().vector(), -U.vector()) self.assertEqual(T, Translate.identity()) self.assertEqual(U.vector(), Point(U[0], U[1])) self.affine(Affine(V), Affine(U)) self.affine(Affine(U), Affine(V)) r = Rect.from_points(Point(0, 2), Point(4, 8)) self.assertEqual((r * (U * V)).min(), r.min() + U.vector() + V.vector())
def test_scale(self): S = Scale() T = Scale( Point (3, 8) ) U = Scale( -3, 1) V = Scale(sqrt(2)) self.assertTrue( Affine(T).is_scale() ) self.assertTrue( Affine(T).is_nonzero_scale() ) self.assertTrue( Affine(V).is_nonzero_uniform_scale()) self.assertEqual( (T*V).vector(), T.vector()*sqrt(2) ) self.assertEqual( (T*U)[0], T[0]*U[0] ) self.assertAlmostEqual( 1/U.inverse()[1], U[1] ) r = Rect.from_points( Point(0, 2), Point(4, 8) ) self.assertAlmostEqual((r*V).area(), 2*r.area()) self.assertFalse(Affine(U).preserves_area()) self.assertTrue(Affine(V).preserves_angles()) self.affine(Affine(T), Affine(U)) self.affine(Affine(U), Affine(V)) self.affine(Affine(V), Affine(T))
def test_scale(self): S = Scale() T = Scale(Point(3, 8)) U = Scale(-3, 1) V = Scale(sqrt(2)) self.assertTrue(Affine(T).is_scale()) self.assertTrue(Affine(T).is_nonzero_scale()) self.assertTrue(Affine(V).is_nonzero_uniform_scale()) self.assertEqual((T * V).vector(), T.vector() * sqrt(2)) self.assertEqual((T * U)[0], T[0] * U[0]) self.assertAlmostEqual(1 / U.inverse()[1], U[1]) r = Rect.from_points(Point(0, 2), Point(4, 8)) self.assertAlmostEqual((r * V).area(), 2 * r.area()) self.assertFalse(Affine(U).preserves_area()) self.assertTrue(Affine(V).preserves_angles()) self.affine(Affine(T), Affine(U)) self.affine(Affine(U), Affine(V)) self.affine(Affine(V), Affine(T))
def rect_basic(self, P, Q): pmin = P.min() pmax = P.max() #for simplicity self.assertTrue(pmin.x > 0) self.assertTrue(pmin.y > 0) self.assertAlmostEqual(pmin.x, P[0].min()) self.assertAlmostEqual(pmax.y, P[1].max()) self.assertEqual(pmin, P.corner(0)) self.assertEqual(pmin, Point(P.left(), P.top())) self.assertEqual(pmax, Point(P.right(), P.bottom())) self.assertAlmostEqual( P.width(), P[0].extent() ) self.assertAlmostEqual( P.height(), P[1].extent() ) self.assertAlmostEqual( P.aspect_ratio(), P.width()/P.height() ) self.assertEqual( P.dimensions(), Point( P.width(), P.height() ) ) self.assertEqual( P.midpoint(), (P.min() + P.max())/2 ) self.assertAlmostEqual(P.area(), P.width()*P.height()) #TODO export EPSILON from 2geom if P.area() > 1e-7: self.assertFalse(P.has_zero_area()) self.assertTrue(P.has_zero_area(P.area())) else: self.assertTrue(P.has_zero_area()) self.assertAlmostEqual(P.max_extent(), max(P.width(), P.height())) self.assertGreaterEqual(P.max_extent(), P.min_extent()) qmin = Q.min() qmax = Q.max() pdiag = (pmax-pmin).length() Q.set_min(P.midpoint()) Q.set_max(P.midpoint()) self.assertTrue(Q.has_zero_area()) #print P,Q Q.expand_by(P.min_extent()/3.0) #print P, Q self.assertTrue(P.contains_rect(Q)) self.assertTrue(P.intersects(Q)) self.assertTrue(Q.intersects(P)) self.assertFalse(Q.contains_rect(P)) self.assertTrue(P.interior_contains_rect(Q)) self.assertFalse(P.interior_contains_rect(P)) self.assertTrue(P.interior_intersects(Q)) self.assertTrue(P.interior_intersects(P)) self.assertTrue(P.contains(P.midpoint())) self.assertFalse(P.contains(P.midpoint()*3)) P.union_with(Q) self.assertEqual( P.min(), pmin ) Q.set_left(qmin.x) Q.set_top(qmin.y) Q.set_right(qmax.x) Q.set_bottom(qmax.y) self.assertEqual(Q.min(), qmin) self.assertEqual(Q.max(), qmax) Q.expand_to( Point() ) self.assertEqual(Point(), Q.min()) Q.expand_by(qmax) self.assertEqual(qmax, -Q.min()) Q.expand_by(-qmax.x, -qmax.y) self.assertEqual(Q.max(), qmax) self.assertEqual( (P+Q.min()).max(), P.max() + Q.min() ) self.assertEqual( (P-Q.max()).min(), P.min() - Q.max() ) self.assertEqual( P|P, P ) self.assertFalse( P != P ) Q.set_left(qmin.x) Q.set_top(qmin.y) Q.set_right(qmax.x) Q.set_bottom(qmax.y) self.assertAlmostEqual(Rect.distance(Point(), P), P.min().length()) self.assertAlmostEqual(Rect.distanceSq(Q.min(), P), Rect.distance(Q.min(), P)**2 ) self.assertEqual(P.round_outwards()[0], P[0].round_outwards()) if P.round_inwards(): self.assertEqual(P.round_inwards().Rect[1], P[1].round_inwards().Interval)