예제 #1
0
파일: curve_test.py 프로젝트: SINTEF/Splipy
    def test_periodic_split(self):
        # non-uniform rational knot vector of a periodic cubic n=7 curve
        controlpoints = [[1, 0, 1], [1, 1, .7], [0, 1, .89], [-1, 1, 0.5],
                         [-1, 0, 1], [-1, -.5, 1], [1, -.5, 1]]
        basis = BSplineBasis(4,
                             [-3, -2, -1, 0, 1, 2, 2.5, 4, 5, 6, 7, 8, 9, 9.5],
                             2)
        crv = Curve(basis, controlpoints, rational=True)
        crv2 = crv.split(1)  # split at knot value
        crv3 = crv.split(6.5)  # split outside existing knot

        self.assertEqual(len(crv), 7)
        self.assertEqual(len(crv2), 10)
        self.assertEqual(len(crv3), 11)

        self.assertEqual(crv.periodic(), True)
        self.assertEqual(crv2.periodic(), False)
        self.assertEqual(crv3.periodic(), False)

        t = np.linspace(6.5, 8,
                        13)  # domain where all parameter values are the same
        pt = crv(t)
        pt2 = crv2(t)
        pt3 = crv3(t)

        self.assertAlmostEqual(np.linalg.norm(pt - pt2), 0.0)
        self.assertAlmostEqual(np.linalg.norm(pt - pt3), 0.0)
예제 #2
0
파일: curve_test.py 프로젝트: SINTEF/Splipy
    def test_make_periodic_reconstruct(self):
        orig = Curve(
            BSplineBasis(4, [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7], 2),
            [[1, 1], [2, 2], [3, 3], [4, 4]],
            rational=True,
        )
        recons = orig.split(0).make_periodic(2)

        self.assertAlmostEqual(
            np.linalg.norm(orig.controlpoints - recons.controlpoints), 0.0)
        self.assertAlmostEqual(
            np.linalg.norm(orig.bases[0].knots - recons.bases[0].knots), 0.0)
예제 #3
0
    def test_periodic_split(self):
        # non-uniform rational knot vector of a periodic cubic n=7 curve
        controlpoints = [[1, 0, 1], [1, 1, .7], [0, 1, .89], [-1, 1, 0.5], [-1, 0, 1], [-1,-.5,1], [1, -.5, 1]]
        basis = BSplineBasis(4, [-3, -2, -1, 0, 1, 2, 2.5, 4, 5, 6, 7, 8, 9, 9.5], 2)
        crv = Curve(basis, controlpoints, rational=True)
        crv2 = crv.split(1)   # split at knot value
        crv3 = crv.split(6.5) # split outside existing knot

        self.assertEqual(len(crv),   7)
        self.assertEqual(len(crv2), 10)
        self.assertEqual(len(crv3), 11)

        self.assertEqual(crv.periodic(),  True)
        self.assertEqual(crv2.periodic(), False)
        self.assertEqual(crv3.periodic(), False)

        t = np.linspace(6.5, 8, 13) # domain where all parameter values are the same
        pt  = crv( t)
        pt2 = crv2(t)
        pt3 = crv3(t)

        self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0)
        self.assertAlmostEqual(np.linalg.norm(pt-pt3), 0.0)
예제 #4
0
    def test_split(self):
        # non-uniform knot vector of a squiggly quadratic n=4 curve
        controlpoints = [[0, 0, 1], [1, 1, 0], [2, -1, 0], [3, 0, 0]]
        crv = Curve(BSplineBasis(3, [0, 0, 0, .7, 1, 1, 1]), controlpoints)

        # get some info on the initial curve
        evaluation_point1 = crv(0.50)
        evaluation_point2 = crv(0.70)
        evaluation_point3 = crv(0.33)

        # split curves away from knot
        new_curves_050 = crv.split(0.50)
        self.assertEqual(len(new_curves_050), 2)
        self.assertEqual(
            len(new_curves_050[0].knots(0, with_multiplicities=True)), 6)  # open knot vector [0,0,0,.5,.5,.5]
        self.assertEqual(
            len(new_curves_050[1].knots(0, with_multiplicities=True)), 7)  # open knot vector [.5,.5,.5,.7,1,1,1]

        # split curves at existing knot
        new_curves_070 = crv.split(0.70)
        self.assertEqual(len(new_curves_070), 2)
        self.assertEqual(
            len(new_curves_070[0].knots(0, with_multiplicities=True)), 6)  # open knot vector [0,0,0,.7,.7,.7]
        self.assertEqual(
            len(new_curves_070[1].knots(0, with_multiplicities=True)), 6)  # open knot vector [.7,.7,.7,1,1,1]

        # split curves multiple points
        new_curves_all = crv.split([0.50, 0.70])
        self.assertEqual(len(new_curves_all), 3)
        self.assertEqual(
            len(new_curves_all[0].knots(0, with_multiplicities=True)), 6)  # open knot vector [0,0,0,.5,.5,.5]
        self.assertEqual(
            len(new_curves_all[1].knots(0, with_multiplicities=True)), 6)  # open knot vector [.5,.5,.5,.7,.7,.7]
        self.assertEqual(
            len(new_curves_all[2].knots(0, with_multiplicities=True)), 6)  # open knot vector [.7,.7,.7,1,1,1]

        # compare all curves which exist at parametric point 0.5
        for c in new_curves_050 + [new_curves_070[0]] + new_curves_all[0:2]:
            new_curve_evaluation = c(0.50)
            self.assertAlmostEqual(evaluation_point1[0], new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point1[1], new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point1[2], new_curve_evaluation[2])

            # compare all curves which exist at parametric point 0.33
        for c in [new_curves_050[0]] + [new_curves_070[0]] + [new_curves_all[0]]:
            new_curve_evaluation = c(0.33)
            self.assertAlmostEqual(evaluation_point3[0], new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point3[1], new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point3[2], new_curve_evaluation[2])

        # compare all curves which exist at parametric point 0.7
        for c in [new_curves_050[1]] + new_curves_070 + new_curves_all[1:3]:
            new_curve_evaluation = c(0.70)
            self.assertAlmostEqual(evaluation_point2[0], new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point2[1], new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point2[2], new_curve_evaluation[2])

            # test errors and exceptions
        with self.assertRaises(TypeError):
            crv.split(.1, .2, .3)  # too many arguments
        with self.assertRaises(Exception):
            crv.split(-0.2)  # GoTools returns error on outside-domain errors
        with self.assertRaises(Exception):
            crv.split(1.4)  # GoTools returns error on outside-domain errors
예제 #5
0
파일: curve_test.py 프로젝트: SINTEF/Splipy
    def test_split(self):
        # non-uniform knot vector of a squiggly quadratic n=4 curve
        controlpoints = [[0, 0, 1], [1, 1, 0], [2, -1, 0], [3, 0, 0]]
        crv = Curve(BSplineBasis(3, [0, 0, 0, .7, 1, 1, 1]), controlpoints)

        # get some info on the initial curve
        evaluation_point1 = crv(0.50)
        evaluation_point2 = crv(0.70)
        evaluation_point3 = crv(0.33)

        # split curves away from knot
        new_curves_050 = crv.split(0.50)
        self.assertEqual(len(new_curves_050), 2)
        self.assertEqual(
            len(new_curves_050[0].knots(0, with_multiplicities=True)),
            6)  # open knot vector [0,0,0,.5,.5,.5]
        self.assertEqual(
            len(new_curves_050[1].knots(0, with_multiplicities=True)),
            7)  # open knot vector [.5,.5,.5,.7,1,1,1]

        # split curves at existing knot
        new_curves_070 = crv.split(0.70)
        self.assertEqual(len(new_curves_070), 2)
        self.assertEqual(
            len(new_curves_070[0].knots(0, with_multiplicities=True)),
            6)  # open knot vector [0,0,0,.7,.7,.7]
        self.assertEqual(
            len(new_curves_070[1].knots(0, with_multiplicities=True)),
            6)  # open knot vector [.7,.7,.7,1,1,1]

        # split curves multiple points
        new_curves_all = crv.split([0.50, 0.70])
        self.assertEqual(len(new_curves_all), 3)
        self.assertEqual(
            len(new_curves_all[0].knots(0, with_multiplicities=True)),
            6)  # open knot vector [0,0,0,.5,.5,.5]
        self.assertEqual(
            len(new_curves_all[1].knots(0, with_multiplicities=True)),
            6)  # open knot vector [.5,.5,.5,.7,.7,.7]
        self.assertEqual(
            len(new_curves_all[2].knots(0, with_multiplicities=True)),
            6)  # open knot vector [.7,.7,.7,1,1,1]

        # compare all curves which exist at parametric point 0.5
        for c in new_curves_050 + [new_curves_070[0]] + new_curves_all[0:2]:
            new_curve_evaluation = c(0.50)
            self.assertAlmostEqual(evaluation_point1[0],
                                   new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point1[1],
                                   new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point1[2],
                                   new_curve_evaluation[2])

            # compare all curves which exist at parametric point 0.33
        for c in [new_curves_050[0]] + [new_curves_070[0]
                                        ] + [new_curves_all[0]]:
            new_curve_evaluation = c(0.33)
            self.assertAlmostEqual(evaluation_point3[0],
                                   new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point3[1],
                                   new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point3[2],
                                   new_curve_evaluation[2])

        # compare all curves which exist at parametric point 0.7
        for c in [new_curves_050[1]] + new_curves_070 + new_curves_all[1:3]:
            new_curve_evaluation = c(0.70)
            self.assertAlmostEqual(evaluation_point2[0],
                                   new_curve_evaluation[0])
            self.assertAlmostEqual(evaluation_point2[1],
                                   new_curve_evaluation[1])
            self.assertAlmostEqual(evaluation_point2[2],
                                   new_curve_evaluation[2])

            # test errors and exceptions
        with self.assertRaises(TypeError):
            crv.split(.1, .2, .3)  # too many arguments
        with self.assertRaises(Exception):
            crv.split(-0.2)  # GoTools returns error on outside-domain errors
        with self.assertRaises(Exception):
            crv.split(1.4)  # GoTools returns error on outside-domain errors