def test_linear(self): L = Linear(0, 1) M = Linear(2) N = Linear() self.assertEqual( (L+M), L+2 ) self.assertEqual( (L-M), L-2 ) self.assertAlmostEqual(L(0.5), lerp(.5, 0, 1)) #~ self.assertTrue(N.is_zero()) self.assertTrue(M.is_constant()) self.assertTrue(L.is_finite()) self.assertAlmostEqual(L(0), L.at0()) self.assertAlmostEqual(L(1), L.at1()) self.assertAlmostEqual(L.value_at(0.3), L(0.3)) self.assertTrue( isinstance(M.to_SBasis(), SBasis )) self.assertAlmostEqual(L.tri(), L(1) - L(0)) self.assertAlmostEqual(L.hat(), (L(1) + L(0))/2) for i in range(11): t = i/10.0 self.assertTrue(L.bounds_exact().Interval.contains(L(t))) self.assertTrue(L.bounds_fast().Interval.contains(L(t))) self.assertTrue(L.bounds_local(t-0.05, t+0.05).Interval.contains(L(t))) self.assertAlmostEqual(lerp(t, 0, 4), t*4) self.assertAlmostEqual(L(t), cy2geom.reverse(L)(1-t)) self.assertAlmostEqual( L(t)*t, (L*t)(t) ) self.assertAlmostEqual( L(t)+t, (L+t)(t) ) self.assertAlmostEqual( L(t)-t, (L-t)(t) ) self.assertAlmostEqual( -( L(t) ), (-L)(t) ) self.assertAlmostEqual( (L/2)(t), L(t)/2 )
def test_bezier(self): B = Bezier() C = Bezier(2) D = Bezier(2, 4) E = Bezier(1, 3, 9) F = Bezier(-2, 5, -1, 2) self.assertTrue( B.is_zero() ) self.assertTrue( C.is_constant() ) self.assertTrue( D.is_finite() ) C.clear() self.assertEqual(D.degree(), 1) self.assertEqual(E.at0(), 1) self.assertEqual(E.at1(), 9) self.assertEqual(E[2], 9) for i in range(11): t = i/10.0 self.assertAlmostEqual( D(t), lerp(t, 2, 4) ) self.assertAlmostEqual( D(t), D.value_at(t)) self.assertAlmostEqual( D.value_and_derivatives(t, 0)[0], D(t) ) self.assertAlmostEqual( D.value_and_derivatives(t, 1)[1], Bezier.derivative(D)(t) ) self.assertAlmostEqual( Bezier.integral(D).value_and_derivatives(t, 1)[1], D(t) ) #~ self.assertAlmostEqual( D.elevate_degree().reduce_degree()(t), D(t) ) self.assertAlmostEqual( (D+2)(t), D(t)+2 ) self.assertAlmostEqual( (D-1)(t), D(t)-1 ) self.assertAlmostEqual( (D*2)(t), D(t)*2 ) self.assertAlmostEqual( (D/4)(t), D(t)/4 ) self.assertTrue( Bezier.bounds_fast(F).Interval.contains(F(t)) ) self.assertTrue( Bezier.bounds_exact(F).Interval.contains(F(t)) ) self.assertTrue( Bezier.bounds_local(F, OptInterval(t-0.05, t+0.05)).Interval.contains(F(t)) ) for r in F.roots(): self.assertAlmostEqual(F(r), 0) #TODO: bug in 2geom? #~ for r in F.roots(Interval(0.1, 0.8)): #~ self.assertAlmostEqual(F(r), 0) #~ self.assertTrue( 0.1 <= r <= 0.8 ) self.assertIsInstance(F.forward_difference(1), Bezier) self.assertIsInstance(F.elevate_degree(), Bezier) self.assertIsInstance(E.reduce_degree(), Bezier) #F.reduce_degree() fails with # *** glibc detected *** python2: malloc(): memory corruption: self.assertIsInstance(F.elevate_to_degree(4), Bezier) self.assertIsInstance(F.deflate(), Bezier) S = F.to_SBasis() self.assertIsInstance(S, SBasis) for i in range(11): t = i/10.0 self.assertAlmostEqual(S(t), F(t))
def curve(self, C): self.assertAlmostEqual(C.initial_point(), C(0)) self.assertAlmostEqual(C.final_point(), C.point_at(1)) #Doesn't have to be true #~ if C.length() > 0.01: #~ self.assertFalse(C.is_degenerate()) if C.is_degenerate(): #trivial special case return for i in range(11): t = i/10.0 self.assertAlmostEqual(C(t).x, C.point_at(t).x) self.assertAlmostEqual(C(t).y, C.value_at(t, 1)) self.assertEqual( C(t), C.point_and_derivatives(t, 1)[0] ) self.assertTrue( C.bounds_exact().contains(C(t)) ) self.assertTrue( C.bounds_fast().contains(C(t)) ) #TODO why this works only with degree = 0? if C.bounds_local(OptInterval(t-0.05, t+0.05), 0 ) and ( C.bounds_local(OptInterval(t-0.05, t+0.05), 0).Rect.area() > 1e-10): #ruling out too small rectangles, they have problems with precision self.assertTrue( C.bounds_local( OptInterval(t-0.05, t+0.05), 0 ).Rect.contains(C(t))) D = C.duplicate() D.set_initial(Point()) self.assertAlmostEqual(D.initial_point(), Point()) D.set_final(Point(1, 1)) self.assertAlmostEqual(D.final_point(), Point(1, 1)) A = Affine( uniform(-10, 10), uniform(-10, 10), uniform(-10, 10), uniform(-10, 10), uniform(-10, 10), uniform(-10, 10)) E = C.transformed(A) for i in range(11): t = i/10.0 # self.assertAlmostEqual( E(t), C(t)*A ) G1 = C.portion(0.2, 0.8) G2 = C.portion( interval=Interval(2, 8)/10 ) self.assertAlmostEqual( G1(0), C(0.2) ) self.assertAlmostEqual( G2(0.5), C( lerp(0.5, 0.2, 0.8) )) self.assertAlmostEqual( G1(1), G2(1) ) for i in range(11): t = i/10.0 self.assertAlmostEqual( C.reverse()(t), C(1-t) ) self.assertAlmostEqual( C.point_and_derivatives(0.3, 1)[1], C.derivative()(0.3) ) self.assertAlmostEqual( C.nearest_time(C(0)), 0 ) self.assertAlmostEqual( C( C.nearest_time(C(0.5), interval=Interval(0.2, 0.5)) ), C(0.5) ) self.assertAlmostEqual( C( C.nearest_time(C(0.5), 0.2, 0.5) ), C(0.5) ) for p in C.all_nearest_times( C(0), 0, 1): self.assertEqual(C(p), C(0)) for p in C.all_nearest_times( C(1), interval=Interval(0, 1)): self.assertEqual(C(p), C(1)) for r in C.roots(0, 0): self.assertAlmostEqual(C.value_at(r, 0), 0) self.assertGreaterEqual(C.length(), abs(C(1) - C(0))) self.assertEqual(C.winding(Point()), int(C.winding(Point())) ) self.assertAlmostEqual( C.unit_tangent_at(0.5), Point.unit_vector(C.derivative()(0.5)) ) self.assertTrue(isinstance(C.to_SBasis()[0], SBasis))