Source code for pyrobopath.toolpath.path.spline

from __future__ import annotations
from typing import Sequence
import numpy as np
from scipy import interpolate

from pyrobopath.tools.types import ArrayLike, NDArray


[docs] class BSpline: def __init__(self, control_points: Sequence[ArrayLike], knot_vector, degree): self.spline = interpolate.BSpline( knot_vector, control_points, degree, extrapolate=False )
[docs] def __call__(self, ui) -> NDArray: return self.spline(ui)
[docs] class CubicBSpline(BSpline): KNOTS = (-3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0) def __init__( self, control_points: Sequence[ArrayLike], knots: ArrayLike | None=None ): self.knots = CubicBSpline.KNOTS if knots is None else knots super(CubicBSpline, self).__init__(control_points, self.knots, 3)
[docs] class CubicBSpline2(BSpline): # fmt: off BASIS = np.array([[ 1, 4, 1, 0], [-3, 0, 3, 0], [ 3,-6, 3, 0], [-1, 3,-3, 1]]) # fmt: on def __init__(self, control_points: Sequence[ArrayLike]): self.c = np.asarray(control_points)
[docs] def __call__(self, ui): return self.__basis(ui) @ self.c
def __basis(self, u): v_t = np.array([1, u, u * u, u**3]) return 1 / 6 * v_t @ CubicBSpline2.BASIS