예제 #1
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 = 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)
예제 #2
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)
예제 #3
0
파일: curve_test.py 프로젝트: SINTEF/Splipy
    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
예제 #4
0
    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