Example #1
0
    def test_normal(self):
        surf = sf.sphere(1)
        surf.swap()
        u = np.linspace(surf.start(0) + 1e-3, surf.end(0) - 1e-3, 9)
        v = np.linspace(surf.start(1) + 1e-3, surf.end(1) - 1e-3, 9)

        xpts = surf(u, v, tensor=False)
        npts = surf.normal(u, v, tensor=False)

        self.assertEqual(npts.shape, (9, 3))

        # check that the normal is pointing out of the unit ball on a 9x9 evaluation grid
        for (x, n) in zip(xpts, npts):
            self.assertAlmostEqual(n[0], x[0])
            self.assertAlmostEqual(n[1], x[1])
            self.assertAlmostEqual(n[2], x[2])

        xpts = surf(u, v)
        npts = surf.normal(u, v)

        self.assertEqual(npts.shape, (9, 9, 3))

        # check that the normal is pointing out of the unit ball on a 9x9 evaluation grid
        for (i, j) in zip(xpts, npts):
            for (x, n) in zip(i, j):
                self.assertAlmostEqual(n[0], x[0])
                self.assertAlmostEqual(n[1], x[1])
                self.assertAlmostEqual(n[2], x[2])

        # check single value input
        n = surf.normal(0, 0)
        self.assertEqual(len(n), 3)

        # test 2D surface
        s = Surface()
        n = s.normal(.5, .5)
        self.assertEqual(len(n), 3)
        self.assertAlmostEqual(n[0], 0.0)
        self.assertAlmostEqual(n[1], 0.0)
        self.assertAlmostEqual(n[2], 1.0)
        n = s.normal([.25, .5], [.1, .2, .3, .4, .5, .6, .7, .8, .9])
        self.assertEqual(n.shape[0], 2)
        self.assertEqual(n.shape[1], 9)
        self.assertEqual(n.shape[2], 3)
        self.assertAlmostEqual(n[1, 4, 0], 0.0)
        self.assertAlmostEqual(n[1, 4, 1], 0.0)
        self.assertAlmostEqual(n[1, 4, 2], 1.0)

        n = s.normal([.25, .5, .75], [.3, .5, .9], tensor=False)
        self.assertEqual(n.shape, (3, 3))
        for i in range(3):
            for j in range(2):
                self.assertAlmostEqual(n[i, j], 0.0)
            self.assertAlmostEqual(n[i, 2], 1.0)

        # test errors
        s = Surface(BSplineBasis(3), BSplineBasis(3), [[0]] * 9)  # 1D-surface
        with self.assertRaises(RuntimeError):
            s.normal(.5, .5)