def test_from_quadratic_not_elevated(self): from bezier import _curve_helpers nodes = np.asfortranarray([[0.0, 1.0, 2.0], [0.0, 1.5, 0.0]]) result = self._call_function_under_test(nodes) expected = np.asfortranarray([[0.0, 2.0], [0.5, 0.5]]) self.assertEqual(result, expected) re_elevated = _curve_helpers.elevate_nodes(result) self.assertTrue(np.any(nodes != re_elevated))
def elevate(self): r"""Return a degree-elevated version of the current curve. Does this by converting the current nodes :math:`v_0, \ldots, v_n` to new nodes :math:`w_0, \ldots, w_{n + 1}` where .. math:: \begin{align*} w_0 &= v_0 \\ w_j &= \frac{j}{n + 1} v_{j - 1} + \frac{n + 1 - j}{n + 1} v_j \\ w_{n + 1} &= v_n \end{align*} .. image:: ../images/curve_elevate.png :align: center .. testsetup:: curve-elevate import numpy as np import bezier .. doctest:: curve-elevate :options: +NORMALIZE_WHITESPACE >>> nodes = np.asfortranarray([ ... [0.0, 0.0], ... [1.5, 1.5], ... [3.0, 0.0], ... ]) >>> curve = bezier.Curve(nodes, degree=2) >>> elevated = curve.elevate() >>> elevated <Curve (degree=3, dimension=2)> >>> elevated.nodes array([[ 0., 0.], [ 1., 1.], [ 2., 1.], [ 3., 0.]]) .. testcleanup:: curve-elevate import make_images make_images.curve_elevate(curve, elevated) Returns: Curve: The degree-elevated curve. """ new_nodes = _curve_helpers.elevate_nodes(self._nodes, self._degree, self._dimension) root = None if self._root is self else self._root return Curve(new_nodes, self._degree + 1, start=self._start, end=self._end, root=root, _copy=False)
def _actually_inverse_helper(self, degree): from bezier import _curve_helpers from bezier import _helpers nodes = np.eye(degree + 2, order="F") reduction_mat = self._call_function_under_test(nodes) id_mat = np.eye(degree + 1, order="F") elevation_mat = _curve_helpers.elevate_nodes(id_mat) result = _helpers.matrix_product(elevation_mat, reduction_mat) return result, id_mat
def _call_function_under_test(nodes, degree, dimension): from bezier import _curve_helpers return _curve_helpers.elevate_nodes(nodes, degree, dimension)