def test_edge_surfaces_six_sides(self): # create the unit cube vol = Volume() vol.raise_order(2,2,2) vol.refine(3) edges = vol.faces() # edge_surface should give back the same unit cube vol2 = VolumeFactory.edge_surfaces(edges) # check discretization self.assertEqual(vol2.order(0), 4) self.assertEqual(vol2.order(1), 4) self.assertEqual(vol2.order(2), 4) self.assertEqual(len(vol2.knots(0)), 5) # [0,.25,.5,.75,1] self.assertEqual(len(vol2.knots(1)), 5) self.assertEqual(len(vol2.knots(2)), 5) # check a 5x5x5 evaluation grid u = np.linspace(0,1,5) v = np.linspace(0,1,5) w = np.linspace(0,1,5) pt = vol( u,v,w) pt2 = vol2(u,v,w) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0)
def test_edge_surfaces_six_sides(self): # create the unit cube vol = Volume() vol.raise_order(2,2,2) vol.refine(3) edges = vol.faces() # edge_surface should give back the same unit cube vol2 = vf.edge_surfaces(edges) # check discretization self.assertEqual(vol2.order(0), 4) self.assertEqual(vol2.order(1), 4) self.assertEqual(vol2.order(2), 4) self.assertEqual(len(vol2.knots(0)), 5) # [0,.25,.5,.75,1] self.assertEqual(len(vol2.knots(1)), 5) self.assertEqual(len(vol2.knots(2)), 5) # check a 5x5x5 evaluation grid u = np.linspace(0,1,5) v = np.linspace(0,1,5) w = np.linspace(0,1,5) pt = vol( u,v,w) pt2 = vol2(u,v,w) self.assertAlmostEqual(np.linalg.norm(pt-pt2), 0.0)
def test_controlpoint_access(self): v = Volume() v.refine(1) self.assertAlmostEqual(v[0,0,0, 0] , 0) self.assertAlmostEqual(v[0,0,0][0] , 0) self.assertAlmostEqual(v[0,1,0][0] , 0) self.assertAlmostEqual(v[0,1,0][1] , .5) self.assertAlmostEqual(v[0,1,0, 1] , .5) self.assertAlmostEqual(v[0,0,2][2] , 1) self.assertAlmostEqual(v[4][0] , .5) self.assertAlmostEqual(v[4][1] , .5) self.assertAlmostEqual(v[4][2] , 0) self.assertAlmostEqual(v[13][0] , .5) self.assertAlmostEqual(v[13][1] , .5) self.assertAlmostEqual(v[13][2] , .5) self.assertAlmostEqual(v[14][0] , 1) self.assertAlmostEqual(v[14][1] , .5) self.assertAlmostEqual(v[14][2] , .5) v[0] = [.1, .1, .1] v[1,1,1] = [.6, .6, .6] v[1,0,0][0] = .4 self.assertAlmostEqual(v[0,0,0][0], .1) self.assertAlmostEqual(v[0,0,0][1], .1) self.assertAlmostEqual(v[0,0,0][2], .1) self.assertAlmostEqual(v[13][0] , .6) self.assertAlmostEqual(v[13][1] , .6) self.assertAlmostEqual(v[13][2] , .6) self.assertAlmostEqual(v[1][0] , .4) self.assertAlmostEqual(v[1][1] , 0) self.assertAlmostEqual(v[1][2] , 0) v[:,0,0] = 13 v[0,1,0][:] = 12 # v[0,2,1] = [9,8,7] # v[0,2,0] = [9,8,7] v[0,2,1::-1] = [9,8,7] v[1,2,1::-1,:] = [[6,5,4],[3,2,1]] self.assertAlmostEqual(v[1,0,0,0], 13) self.assertAlmostEqual(v[1,0,0,1], 13) self.assertAlmostEqual(v[2,0,0,2], 13) self.assertAlmostEqual(v[0,1,0,0], 12) self.assertAlmostEqual(v[0,1,0,2], 12) self.assertAlmostEqual(v[0,2,2,1], 1) self.assertAlmostEqual(v[0,2,1,0], 9) self.assertAlmostEqual(v[0,2,1,1], 8) self.assertAlmostEqual(v[0,2,0,2], 7) self.assertAlmostEqual(v[1,2,1,0], 6) self.assertAlmostEqual(v[1,2,1,1], 5) self.assertAlmostEqual(v[1,2,1,2], 4) self.assertAlmostEqual(v[1,2,0,0], 3) self.assertAlmostEqual(v[1,2,0,1], 2) self.assertAlmostEqual(v[1,2,0,2], 1)
def test_controlpoint_access(self): v = Volume() v.refine(1) self.assertAlmostEqual(v[0, 0, 0, 0], 0) self.assertAlmostEqual(v[0, 0, 0][0], 0) self.assertAlmostEqual(v[0, 1, 0][0], 0) self.assertAlmostEqual(v[0, 1, 0][1], .5) self.assertAlmostEqual(v[0, 1, 0, 1], .5) self.assertAlmostEqual(v[0, 0, 2][2], 1) self.assertAlmostEqual(v[4][0], .5) self.assertAlmostEqual(v[4][1], .5) self.assertAlmostEqual(v[4][2], 0) self.assertAlmostEqual(v[13][0], .5) self.assertAlmostEqual(v[13][1], .5) self.assertAlmostEqual(v[13][2], .5) self.assertAlmostEqual(v[14][0], 1) self.assertAlmostEqual(v[14][1], .5) self.assertAlmostEqual(v[14][2], .5) v[0] = [.1, .1, .1] v[1, 1, 1] = [.6, .6, .6] v[1, 0, 0][0] = .4 self.assertAlmostEqual(v[0, 0, 0][0], .1) self.assertAlmostEqual(v[0, 0, 0][1], .1) self.assertAlmostEqual(v[0, 0, 0][2], .1) self.assertAlmostEqual(v[13][0], .6) self.assertAlmostEqual(v[13][1], .6) self.assertAlmostEqual(v[13][2], .6) self.assertAlmostEqual(v[1][0], .4) self.assertAlmostEqual(v[1][1], 0) self.assertAlmostEqual(v[1][2], 0) v[:, 0, 0] = 13 v[0, 1, 0][:] = 12 # v[0,2,1] = [9,8,7] # v[0,2,0] = [9,8,7] v[0, 2, 1::-1] = [9, 8, 7] v[1, 2, 1::-1, :] = [[6, 5, 4], [3, 2, 1]] self.assertAlmostEqual(v[1, 0, 0, 0], 13) self.assertAlmostEqual(v[1, 0, 0, 1], 13) self.assertAlmostEqual(v[2, 0, 0, 2], 13) self.assertAlmostEqual(v[0, 1, 0, 0], 12) self.assertAlmostEqual(v[0, 1, 0, 2], 12) self.assertAlmostEqual(v[0, 2, 2, 1], 1) self.assertAlmostEqual(v[0, 2, 1, 0], 9) self.assertAlmostEqual(v[0, 2, 1, 1], 8) self.assertAlmostEqual(v[0, 2, 0, 2], 7) self.assertAlmostEqual(v[1, 2, 1, 0], 6) self.assertAlmostEqual(v[1, 2, 1, 1], 5) self.assertAlmostEqual(v[1, 2, 1, 2], 4) self.assertAlmostEqual(v[1, 2, 0, 0], 3) self.assertAlmostEqual(v[1, 2, 0, 1], 2) self.assertAlmostEqual(v[1, 2, 0, 2], 1)
def test_operators(self): v = Volume() v.raise_order(1, 1, 2) v.refine(3, 2, 1) # test translation operator v2 = v + [1, 0, 0] v3 = [1, 0, 0] + v v += [1, 0, 0] self.assertTrue(np.allclose(v2.controlpoints, v3.controlpoints)) self.assertTrue(np.allclose(v.controlpoints, v3.controlpoints)) # test scaling operator v2 = v * 3 v3 = 3 * v v *= 3 self.assertTrue(np.allclose(v2.controlpoints, v3.controlpoints)) self.assertTrue(np.allclose(v.controlpoints, v3.controlpoints))
def test_make_identical(self): basis1 = BSplineBasis(4, [-1, -1, 0, 0, 1, 1, 2, 2], periodic=1) basis2 = BSplineBasis(3, [-1, 0, 0, 1, 1, 2], periodic=0) basis3 = BSplineBasis(2) vol1 = Volume() vol2 = Volume(basis1, basis2, basis3) vol1.refine(1) Volume.make_splines_identical(vol1, vol2) for v in (vol1, vol2): self.assertEqual(v.periodic(0), False) self.assertEqual(v.periodic(1), False) self.assertEqual(v.periodic(2), False) self.assertEqual(v.order(), (4, 3, 2)) self.assertAlmostEqual(len(v.knots(0, True)), 11) self.assertAlmostEqual(len(v.knots(1, True)), 8) self.assertAlmostEqual(len(v.knots(2, True)), 5)
def test_operators(self): v = Volume() v.raise_order(1,1,2) v.refine(3,2,1) # test translation operator v2 = v + [1,0,0] v3 = [1,0,0] + v v += [1,0,0] self.assertTrue(np.allclose(v2.controlpoints, v3.controlpoints)) self.assertTrue(np.allclose(v.controlpoints, v3.controlpoints)) # test scaling operator v2 = v * 3 v3 = 3 * v v *= 3 self.assertTrue(np.allclose(v2.controlpoints, v3.controlpoints)) self.assertTrue(np.allclose(v.controlpoints, v3.controlpoints))
def test_make_identical(self): basis1 = BSplineBasis(4, [-1,-1,0,0,1,1,2,2], periodic=1) basis2 = BSplineBasis(3, [-1,0,0,1,1,2], periodic=0) basis3 = BSplineBasis(2) vol1 = Volume() vol2 = Volume(basis1, basis2, basis3) vol1.refine(1) Volume.make_splines_identical(vol1,vol2) for v in (vol1, vol2): self.assertEqual(v.periodic(0), False) self.assertEqual(v.periodic(1), False) self.assertEqual(v.periodic(2), False) self.assertEqual(v.order(), (4,3,2)) self.assertAlmostEqual(len(v.knots(0, True)), 11) self.assertAlmostEqual(len(v.knots(1, True)), 8) self.assertAlmostEqual(len(v.knots(2, True)), 5)
def test_bounding_box(self): vol = Volume() bb = vol.bounding_box() self.assertAlmostEqual(bb[0][0], 0) self.assertAlmostEqual(bb[0][1], 1) self.assertAlmostEqual(bb[1][0], 0) self.assertAlmostEqual(bb[1][1], 1) self.assertAlmostEqual(bb[2][0], 0) self.assertAlmostEqual(bb[2][1], 1) vol.refine(2) vol.rotate(pi / 4, [1, 0, 0]) vol += (1, 0, 1) bb = vol.bounding_box() self.assertAlmostEqual(bb[0][0], 1) self.assertAlmostEqual(bb[0][1], 2) self.assertAlmostEqual(bb[1][0], -sqrt(2) / 2) self.assertAlmostEqual(bb[1][1], sqrt(2) / 2) self.assertAlmostEqual(bb[2][0], 1) self.assertAlmostEqual(bb[2][1], 1 + sqrt(2))
def test_bounding_box(self): vol = Volume() bb = vol.bounding_box() self.assertAlmostEqual(bb[0][0], 0 ) self.assertAlmostEqual(bb[0][1], 1 ) self.assertAlmostEqual(bb[1][0], 0 ) self.assertAlmostEqual(bb[1][1], 1 ) self.assertAlmostEqual(bb[2][0], 0 ) self.assertAlmostEqual(bb[2][1], 1 ) vol.refine(2) vol.rotate(pi/4, [1,0,0]) vol += (1,0,1) bb = vol.bounding_box() self.assertAlmostEqual(bb[0][0], 1 ) self.assertAlmostEqual(bb[0][1], 2 ) self.assertAlmostEqual(bb[1][0], -sqrt(2)/2 ) self.assertAlmostEqual(bb[1][1], sqrt(2)/2 ) self.assertAlmostEqual(bb[2][0], 1 ) self.assertAlmostEqual(bb[2][1], 1+sqrt(2) )