def test_raise_order(self): # more or less random 3D volume with p=[2,2,1] and n=[4,3,2] controlpoints = [[0, 0, 0], [-1, 1, 0], [0, 2, 0], [1, -1, 0], [1, 0, 0], [1, 1, 0], [2, 1, 0], [2, 2, 0], [2, 3, 0], [3, 0, 0], [4, 1, 0], [3, 2, 0], [0, 0, 1], [-1, 1, 1], [0, 2, 1], [1, -1, 2], [1, 0, 2], [1, 1, 2], [2, 1, 2], [2, 2, 2], [2, 3, 2], [3, 0, 1], [4, 1, 1], [3, 2, 1]] basis1 = BSplineBasis(3, [0, 0, 0, .4, 1, 1, 1]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints) self.assertEqual(vol.order(), (3, 3, 2)) evaluation_point1 = vol( 0.23, 0.37, 0.44) # pick some evaluation point (could be anything) vol.raise_order(1, 2, 4) self.assertEqual(vol.order(), (4, 5, 6)) evaluation_point2 = vol(0.23, 0.37, 0.44) # evaluation before and after RaiseOrder should remain unchanged 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 a rational 3D volume controlpoints = [[0, 0, 1, 1], [-1, 1, .96, 1], [0, 2, 1, 1], [1, -1, 1, 1], [1, 0, .8, 1], [1, 1, 1, 1], [2, 1, .89, 1], [2, 2, .9, 1], [2, 3, 1, 1], [3, 0, 1, 1], [4, 1, 1, 1], [3, 2, 1, 1], [0, 0, 1, 2], [-1, 1, .7, 2], [0, 2, 1.3, 2], [1, -1, 1, 2], [1, 0, .77, 2], [1, 1, 1, 2], [2, 1, .89, 1], [2, 2, .8, 4], [2, 3, 1, 1], [3, 0, 1, 1], [4, 1, 1, 1], [3, 2, 1, 1]] basis1 = BSplineBasis(3, [0, 0, 0, .4, 1, 1, 1]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints, True) self.assertEqual(vol.order()[0], 3) self.assertEqual(vol.order()[1], 3) evaluation_point1 = vol(0.23, 0.37, 0.44) vol.raise_order(1, 2, 1) self.assertEqual(vol.order(), (4, 5, 3)) evaluation_point2 = vol(0.23, 0.37, 0.44) # evaluation before and after RaiseOrder should remain unchanged self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2])
def test_swap(self): # more or less random 3D volume with p=[3,2,1] and n=[4,3,2] controlpoints = [[0, 0, 1], [-1, 1, 1], [0, 2, 1], [1, -1, 2], [1, 0, 2], [1, 1, 2], [2, 1, 2], [2, 2, 2], [2, 3, 2], [3, 0, 0], [4, 1, 0], [3, 2, 0], [0, 0, 3], [-1, 1, 3], [0, 2, 3], [1, -1, 5], [1, 0, 5], [1, 1, 5], [2, 1, 4], [2, 2, 4], [2, 3, 4], [3, 0, 2], [4, 1, 2], [3, 2, 2]] basis1 = BSplineBasis(4, [0, 0, 0, 0, 2, 2, 2, 2]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints) evaluation_point1 = vol(0.23, .56, .12) control_point1 = vol[ 1] # this is control point i=(1,0,0), when n=(4,3,2) self.assertEqual(vol.order(), (4, 3, 2)) vol.swap(0, 1) evaluation_point2 = vol(0.56, .23, .12) control_point2 = vol[ 3] # this is control point i=(0,1,0), when n=(3,4,2) self.assertEqual(vol.order(), (3, 4, 2)) # ensure that volume 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]) # check that the control points have re-ordered themselves self.assertEqual(control_point1[0], control_point2[0]) self.assertEqual(control_point1[1], control_point2[1]) self.assertEqual(control_point1[2], control_point2[2]) vol.swap(1, 2) evaluation_point3 = vol(.56, .12, .23) control_point3 = vol[ 6] # this is control point i=(0,0,1), when n=(3,2,4) self.assertEqual(vol.order(), (3, 2, 4)) # ensure that volume 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]) # check that the control points have re-ordered themselves self.assertEqual(control_point1[0], control_point3[0]) self.assertEqual(control_point1[1], control_point3[1]) self.assertEqual(control_point1[2], control_point3[2])
def test_raise_order(self): # more or less random 3D volume with p=[2,2,1] and n=[4,3,2] controlpoints = [[0, 0, 0], [-1, 1, 0], [0, 2, 0], [1, -1, 0], [1, 0, 0], [1, 1, 0], [2, 1, 0], [2, 2, 0], [2, 3, 0], [3, 0, 0], [4, 1, 0], [3, 2, 0], [0, 0, 1], [-1, 1, 1], [0, 2, 1], [1, -1, 2], [1, 0, 2], [1, 1, 2], [2, 1, 2], [2, 2, 2], [2, 3, 2], [3, 0, 1], [4, 1, 1], [3, 2, 1]] basis1 = BSplineBasis(3, [0, 0, 0, .4, 1, 1, 1]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints) self.assertEqual(vol.order(), (3, 3, 2)) evaluation_point1 = vol(0.23, 0.37, 0.44) # pick some evaluation point (could be anything) vol.raise_order(1, 2, 4) self.assertEqual(vol.order(), (4, 5, 6)) evaluation_point2 = vol(0.23, 0.37, 0.44) # evaluation before and after RaiseOrder should remain unchanged 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 a rational 3D volume controlpoints = [[0, 0, 1, 1], [-1, 1, .96, 1], [0, 2, 1, 1], [1, -1, 1, 1], [1, 0, .8, 1], [1, 1, 1, 1], [2, 1, .89, 1], [2, 2, .9, 1], [2, 3, 1, 1], [3, 0, 1, 1], [4, 1, 1, 1], [3, 2, 1, 1], [0, 0, 1, 2], [-1, 1, .7, 2], [0, 2, 1.3, 2], [1, -1, 1, 2], [1, 0, .77, 2], [1, 1, 1, 2], [2, 1, .89, 1], [2, 2, .8, 4], [2, 3, 1, 1], [3, 0, 1, 1], [4, 1, 1, 1], [3, 2, 1, 1]] basis1 = BSplineBasis(3, [0, 0, 0, .4, 1, 1, 1]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints, True) self.assertEqual(vol.order()[0], 3) self.assertEqual(vol.order()[1], 3) evaluation_point1 = vol(0.23, 0.37, 0.44) vol.raise_order(1, 2, 1) self.assertEqual(vol.order(), (4, 5, 3)) evaluation_point2 = vol(0.23, 0.37, 0.44) # evaluation before and after RaiseOrder should remain unchanged self.assertAlmostEqual(evaluation_point1[0], evaluation_point2[0]) self.assertAlmostEqual(evaluation_point1[1], evaluation_point2[1]) self.assertAlmostEqual(evaluation_point1[2], evaluation_point2[2])
def test_evaluate(self): # creating the identity mapping by different size for all directions vol = Volume(BSplineBasis(7), BSplineBasis(6), BSplineBasis(5)) # call evaluation at a 2x3x4 grid of points u_val = np.linspace(0, 1, 2) v_val = np.linspace(0, 1, 3) w_val = np.linspace(0, 1, 4) value = vol(u_val, v_val, w_val) self.assertEqual(value.shape[0], 2) # 2 u-evaluation points self.assertEqual(value.shape[1], 3) # 3 v-evaluation points self.assertEqual(value.shape[2], 4) # 4 w-evaluation points self.assertEqual(value.shape[3], 3) # 3 dimensions (x,y,z) self.assertEqual(vol.order(), (7, 6, 5)) for i, u in enumerate(u_val): for j, v in enumerate(v_val): for k, w in enumerate(w_val): self.assertAlmostEqual(value[i, j, k, 0], u) # identity map x=u self.assertAlmostEqual(value[i, j, k, 1], v) # identity map y=v self.assertAlmostEqual(value[i, j, k, 2], w) # identity map z=w # test errors and exceptions with self.assertRaises(ValueError): val = vol(-10, .5, .5) # evalaute outside parametric domain with self.assertRaises(ValueError): val = vol(+10, .3, .3) # evalaute outside parametric domain with self.assertRaises(ValueError): val = vol(.5, -10, .123) # evalaute outside parametric domain with self.assertRaises(ValueError): val = vol(.5, +10, .123) # evalaute outside parametric domain with self.assertRaises(ValueError): val = vol(.5, .2, +10) # evalaute outside parametric domain with self.assertRaises(ValueError): val = vol(.5, .2, -10) # evalaute outside parametric domain
def test_swap(self): # more or less random 3D volume with p=[3,2,1] and n=[4,3,2] controlpoints = [[0, 0, 1], [-1, 1, 1], [0, 2, 1], [1, -1, 2], [1, 0, 2], [1, 1, 2], [2, 1, 2], [2, 2, 2], [2, 3, 2], [3, 0, 0], [4, 1, 0], [3, 2, 0], [0, 0, 3], [-1, 1, 3], [0, 2, 3], [1, -1, 5], [1, 0, 5], [1, 1, 5], [2, 1, 4], [2, 2, 4], [2, 3, 4], [3, 0, 2], [4, 1, 2], [3, 2, 2]] basis1 = BSplineBasis(4, [0, 0, 0, 0, 2, 2, 2, 2]) basis2 = BSplineBasis(3, [0, 0, 0, 1, 1, 1]) basis3 = BSplineBasis(2, [0, 0, 1, 1]) vol = Volume(basis1, basis2, basis3, controlpoints) evaluation_point1 = vol(0.23, .56, .12) control_point1 = vol[1] # this is control point i=(1,0,0), when n=(4,3,2) self.assertEqual(vol.order(), (4, 3, 2)) vol.swap(0, 1) evaluation_point2 = vol(0.56, .23, .12) control_point2 = vol[3] # this is control point i=(0,1,0), when n=(3,4,2) self.assertEqual(vol.order(), (3, 4, 2)) # ensure that volume 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]) # check that the control points have re-ordered themselves self.assertEqual(control_point1[0], control_point2[0]) self.assertEqual(control_point1[1], control_point2[1]) self.assertEqual(control_point1[2], control_point2[2]) vol.swap(1, 2) evaluation_point3 = vol(.56, .12, .23) control_point3 = vol[6] # this is control point i=(0,0,1), when n=(3,2,4) self.assertEqual(vol.order(), (3, 2, 4)) # ensure that volume 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]) # check that the control points have re-ordered themselves self.assertEqual(control_point1[0], control_point3[0]) self.assertEqual(control_point1[1], control_point3[1]) self.assertEqual(control_point1[2], control_point3[2])