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)
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)
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)
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
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