def test_reparam(self): # non-uniform knot vector of a squiggly quadratic n=4 curve controlpoints = [[0, 0, 0], [1, 1, 0], [2, -1, 0], [3, 0, 0]] crv = Curve(BSplineBasis(3, [0, 0, 0, 1.32, 3, 3, 3]), controlpoints) # get some info on the initial curve knots1 = crv.knots(0) evaluation_point1 = crv(1.20) self.assertEqual(knots1[0], 0) self.assertEqual(knots1[-1], 3) # reparametrize crv.reparam((6.0, 9.0)) # get some info on the reparametrized curve knots2 = crv.knots(0) evaluation_point2 = crv(7.20) self.assertEqual(knots2[0], 6) self.assertEqual(knots2[-1], 9) # ensure that curve has not chcanged, by comparing evaluation of it self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # normalize, i.e. set domain to [0,1] crv.reparam() # get some info on the normalized curve knots3 = crv.knots(0) evaluation_point3 = crv(0.40) self.assertEqual(knots3[0], 0) self.assertEqual(knots3[-1], 1) # ensure that curve has not chcanged, by comparing evaluation of it self.assertAlmostEqual(evaluation_point1[0], evaluation_point3[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point3[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point3[2]) # test errors and exceptions with self.assertRaises(ValueError): crv.reparam((9, 3)) with self.assertRaises(TypeError): crv.reparam(("one", "two"))
def test_insert_knot(self): # non-uniform knot vector of a squiggly quadratic n=5 curve in 3D controlpoints = [[0, 0, 0], [1, 1, 1], [2, -1, 0], [3, 0, -1], [0, 0, -5]] crv = Curve(BSplineBasis(3, [0, 0, 0, .3, .4, 1, 1, 1]), controlpoints) evaluation_point1 = crv(0.37) crv.insert_knot(.2) crv.insert_knot(.3) crv.insert_knot(.9) evaluation_point2 = crv(0.37) # ensure that curve has not chcanged, by comparing evaluation of it self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) self.assertEqual(len(crv.knots(0, with_multiplicities=True)), 11) # test knot insertion on single knot span crv = Curve(BSplineBasis(5), [[0, 0, 0], [1, 1, 1], [2, -1, 0], [3, 0, -1], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.2) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion on first of two-knot span crv = Curve( BSplineBasis(3, [0, 0, 0, .5, 1, 1, 1]), [[0, 0, 0], [2, -1, 0], [3, 0, -1], [0, 0, -5] ]) evaluation_point1 = crv(0.27) crv.insert_knot(.2) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion on last of two-knot span crv = Curve( BSplineBasis(3, [0, 0, 0, .5, 1, 1, 1]), [[0, 0, 0], [2, -1, 0], [3, 0, -1], [0, 0, -5] ]) evaluation_point1 = crv(0.27) crv.insert_knot(.9) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion down to C0 basis crv = Curve(BSplineBasis(3), [[0, 0, 0], [2, -1, 0], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.4) crv.insert_knot(.4) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test rational curves, here a perfect circle represented as n=9, p=2-curve s = 1.0 / sqrt(2) controlpoints = [[1, 0, 1], [s, s, s], [0, 1, 1], [-s, s, s], [-1, 0, 1], [-s, -s, s], [0, -1, 1], [s, -s, s], [1, 0, 1]] crv = Curve(BSplineBasis(3, [-1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5]), controlpoints, True) evaluation_point1 = crv(0.37) crv.insert_knot(.2) crv.insert_knot(.3) crv.insert_knot(.9) evaluation_point2 = crv(0.37) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertEqual(len(crv.knots(0, with_multiplicities=True)), 15) # test errors and exceptions with self.assertRaises(TypeError): crv.insert_knot(1, 2, 3) # too many arguments with self.assertRaises(ValueError): crv.insert_knot(1, 2) # direction=2 is illegal for curves with self.assertRaises(TypeError): crv.insert_knot() # too few arguments with self.assertRaises(ValueError): crv.insert_knot(-0.2) # Outside-domain error with self.assertRaises(ValueError): crv.insert_knot(4.4) # Outside-domain error
def test_insert_knot(self): # non-uniform knot vector of a squiggly quadratic n=5 curve in 3D controlpoints = [[0, 0, 0], [1, 1, 1], [2, -1, 0], [3, 0, -1], [0, 0, -5]] crv = Curve(BSplineBasis(3, [0, 0, 0, .3, .4, 1, 1, 1]), controlpoints) evaluation_point1 = crv(0.37) crv.insert_knot(.2) crv.insert_knot(.3) crv.insert_knot(.9) evaluation_point2 = crv(0.37) # ensure that curve has not chcanged, by comparing evaluation of it self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) self.assertEqual(len(crv.knots(0, with_multiplicities=True)), 11) # test knot insertion on single knot span crv = Curve(BSplineBasis(5), [[0, 0, 0], [1, 1, 1], [2, -1, 0], [3, 0, -1], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.2) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion on first of two-knot span crv = Curve(BSplineBasis(3, [0, 0, 0, .5, 1, 1, 1]), [[0, 0, 0], [2, -1, 0], [3, 0, -1], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.2) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion on last of two-knot span crv = Curve(BSplineBasis(3, [0, 0, 0, .5, 1, 1, 1]), [[0, 0, 0], [2, -1, 0], [3, 0, -1], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.9) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test knot insertion down to C0 basis crv = Curve(BSplineBasis(3), [[0, 0, 0], [2, -1, 0], [0, 0, -5]]) evaluation_point1 = crv(0.27) crv.insert_knot(.4) crv.insert_knot(.4) evaluation_point2 = crv(0.27) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2]) # test rational curves, here a perfect circle represented as n=9, p=2-curve s = 1.0 / sqrt(2) controlpoints = [[1, 0, 1], [s, s, s], [0, 1, 1], [-s, s, s], [-1, 0, 1], [-s, -s, s], [0, -1, 1], [s, -s, s], [1, 0, 1]] crv = Curve(BSplineBasis(3, [-1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5]), controlpoints, True) evaluation_point1 = crv(0.37) crv.insert_knot(.2) crv.insert_knot(.3) crv.insert_knot(.9) evaluation_point2 = crv(0.37) self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertEqual(len(crv.knots(0, with_multiplicities=True)), 15) # test errors and exceptions with self.assertRaises(TypeError): crv.insert_knot(1, 2, 3) # too many arguments with self.assertRaises(ValueError): crv.insert_knot(1, 2) # direction=2 is illegal for curves with self.assertRaises(TypeError): crv.insert_knot() # too few arguments with self.assertRaises(ValueError): crv.insert_knot(-0.2) # Outside-domain error with self.assertRaises(ValueError): crv.insert_knot(4.4) # Outside-domain error