def test_surface_loft(self): crv1 = Curve(BSplineBasis(3, range(11), 1), [[1,-1], [1,0], [1,1], [-1,1], [-1,0], [-1,-1]]) crv2 = CurveFactory.circle(2) + (0,0,1) crv3 = Curve(BSplineBasis(4, range(11), 2), [[1,-1,2], [1,1,2], [-1,1,2], [-1,-1,2]]) crv4 = CurveFactory.circle(2) + (0,0,3) surf = SurfaceFactory.loft(crv1, crv2, crv3, crv4) crv1.set_dimension(3) # for convenience when evaluating t = np.linspace( 0, 1, 13) u = np.linspace(crv1.start(0), crv1.end(0), 13) pt = crv1(u) pt2 = surf(t,0).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv2.start(0), crv2.end(0), 13) pt = crv2(u) pt2 = surf(t,1).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv3.start(0), crv3.end(0), 13) pt = crv3(u) pt2 = surf(t,2).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv4.start(0), crv4.end(0), 13) pt = crv4(u) pt2 = surf(t,3).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0)
def test_surface_loft(self): crv1 = Curve(BSplineBasis(3, range(11), 1), [[1,-1], [1,0], [1,1], [-1,1], [-1,0], [-1,-1]]) crv2 = cf.circle(2) + (0,0,1) crv3 = Curve(BSplineBasis(4, range(11), 2), [[1,-1,2], [1,1,2], [-1,1,2], [-1,-1,2]]) crv4 = cf.circle(2) + (0,0,3) surf = sf.loft(crv1, crv2, crv3, crv4) crv1.set_dimension(3) # for convenience when evaluating t = np.linspace( 0, 1, 13) u = np.linspace(crv1.start(0), crv1.end(0), 13) pt = crv1(u) pt2 = surf(t,0).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv2.start(0), crv2.end(0), 13) pt = crv2(u) pt2 = surf(t,1).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv3.start(0), crv3.end(0), 13) pt = crv3(u) pt2 = surf(t,2).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0) u = np.linspace(crv4.start(0), crv4.end(0), 13) pt = crv4(u) pt2 = surf(t,3).reshape(13,3) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0)
def test_curvature(self): # linear curves have zero curvature crv = Curve() self.assertAlmostEqual(crv.curvature(.3), 0.0) # test multiple evaluation points t = np.linspace(0, 1, 10) k = crv.curvature(t) self.assertTrue(np.allclose(k, 0.0)) # test circle crv = cf.circle(r=3) + [1, 1] t = np.linspace(0, 2 * pi, 10) k = crv.curvature(t) self.assertTrue(np.allclose(k, 1.0 / 3.0)) # circles: k = 1/r # test 3D (np.cross has different behaviour in 2D/3D) crv.set_dimension(3) k = crv.curvature(t) self.assertTrue(np.allclose(k, 1.0 / 3.0)) # circles: k = 1/r
def test_thicken(self): c = Curve() # 2D curve from (0,0) to (1,0) s = sf.thicken(c, .5) # extend to y=[-.5, .5] self.assertTupleEqual(s.order(), (2, 2)) self.assertTupleEqual(s.start(), (0, 0)) self.assertTupleEqual(s.end(), (1, 1)) self.assertTupleEqual(s.bounding_box()[0], (0.0, 1.0)) self.assertTupleEqual(s.bounding_box()[1], (-.5, .5)) # test a case with vanishing velocity. x'(t)=0, y'(t)=0 for t=0 c = Curve(BSplineBasis(3), [[0, 0], [0, 0], [1, 0]]) # x(t)=t^2, y(t)=0 s = sf.thicken(c, .5) self.assertTupleEqual(s.order(), (3, 2)) self.assertTupleEqual(s.start(), (0, 0)) self.assertTupleEqual(s.end(), (1, 1)) self.assertTupleEqual(s.bounding_box()[0], (0.0, 1.0)) self.assertTupleEqual(s.bounding_box()[1], (-.5, .5)) def myThickness(t): return t**2 c = Curve(BSplineBasis(3)) s = sf.thicken(c, myThickness) self.assertTupleEqual(s.order(), (3, 2)) self.assertTupleEqual(s.start(), (0, 0)) self.assertTupleEqual(s.end(), (1, 1)) self.assertTupleEqual(s.bounding_box()[0], (0.0, 1.0)) self.assertTupleEqual(s.bounding_box()[1], (-1.0, 1.0)) # test 3D geometry c = Curve() c.set_dimension(3) s = sf.thicken(c, 1) # cylinder along x-axis with h=1, r=1 for u in np.linspace(s.start(0), s.end(0), 5): for v in np.linspace(s.start(1), s.end(1), 5): x = s(u, v) self.assertAlmostEqual(x[1]**2 + x[2]**2, 1.0**2) # distance to x-axis self.assertAlmostEqual(x[0], u) # x coordinate should be linear
def test_thicken(self): c = Curve() # 2D curve from (0,0) to (1,0) s = SurfaceFactory.thicken(c, .5) # extend to y=[-.5, .5] self.assertTupleEqual(s.order(), (2,2)) self.assertTupleEqual(s.start(), (0,0)) self.assertTupleEqual(s.end(), (1,1)) self.assertTupleEqual(s.bounding_box()[0], (0.0,1.0)) self.assertTupleEqual(s.bounding_box()[1], (-.5, .5)) # test a case with vanishing velocity. x'(t)=0, y'(t)=0 for t=0 c = Curve(BSplineBasis(3), [[0,0],[0,0],[1,0]]) # x(t)=t^2, y(t)=0 s = SurfaceFactory.thicken(c, .5) self.assertTupleEqual(s.order(), (3,2)) self.assertTupleEqual(s.start(), (0,0)) self.assertTupleEqual(s.end(), (1,1)) self.assertTupleEqual(s.bounding_box()[0], (0.0,1.0)) self.assertTupleEqual(s.bounding_box()[1], (-.5, .5)) def myThickness(t): return t**2 c = Curve(BSplineBasis(3)) s = SurfaceFactory.thicken(c, myThickness) self.assertTupleEqual(s.order(), (3,2)) self.assertTupleEqual(s.start(), (0,0)) self.assertTupleEqual(s.end(), (1,1)) self.assertTupleEqual(s.bounding_box()[0], ( 0.0, 1.0)) self.assertTupleEqual(s.bounding_box()[1], (-1.0, 1.0)) # test 3D geometry c = Curve() c.set_dimension(3) s = SurfaceFactory.thicken(c, 1) # cylinder along x-axis with h=1, r=1 for u in np.linspace(s.start(0), s.end(0), 5): for v in np.linspace(s.start(1), s.end(1), 5): x = s(u, v) self.assertAlmostEqual(x[1]**2+x[2]**2, 1.0**2) # distance to x-axis self.assertAlmostEqual(x[0], u) # x coordinate should be linear