Коммит 688f49f3 создал по автору Ilya Portnov's avatar Ilya Portnov
Просмотр файлов

Some api for Bezier curves.

владелец 058665de
...@@ -9,7 +9,7 @@ import numpy as np ...@@ -9,7 +9,7 @@ import numpy as np
from sverchok.data_structure import zip_long_repeat from sverchok.data_structure import zip_long_repeat
from sverchok.utils.math import binomial from sverchok.utils.math import binomial
from sverchok.utils.geom import Spline from sverchok.utils.geom import Spline, bounding_box
from sverchok.utils.nurbs_common import SvNurbsMaths from sverchok.utils.nurbs_common import SvNurbsMaths
from sverchok.utils.curve.core import SvCurve, UnsupportedCurveTypeException from sverchok.utils.curve.core import SvCurve, UnsupportedCurveTypeException
from sverchok.utils.curve.algorithms import concatenate_curves from sverchok.utils.curve.algorithms import concatenate_curves
...@@ -272,16 +272,35 @@ class SvBezierCurve(SvCurve): ...@@ -272,16 +272,35 @@ class SvBezierCurve(SvCurve):
result.append(third) result.append(third)
return result return result
def reparametrize(self, new_t_min, new_t_max):
return self.to_nurbs().reparametrize(new_t_min, new_t_max)
def get_degree(self): def get_degree(self):
return self.degree return self.degree
def get_control_points(self): def get_control_points(self):
return self.points return self.points
def elevate_degree(self, delta=1): def elevate_degree(self, delta=None, target=None):
if delta is None and target is None:
delta = 1
if delta is not None and target is not None:
raise Exception("Of delta and target, only one parameter can be specified")
degree = self.get_degree()
if delta is None:
delta = target - degree
if delta < 0:
raise Exception(f"Curve already has degree {degree}, which is greater than target {target}")
if delta == 0:
return self
points = elevate_bezier_degree(self.degree, self.points, delta) points = elevate_bezier_degree(self.degree, self.points, delta)
return SvBezierCurve(points) return SvBezierCurve(points)
def get_bounding_box(self):
return bounding_box(self.get_control_points())
def to_nurbs(self, implementation = SvNurbsMaths.NATIVE): def to_nurbs(self, implementation = SvNurbsMaths.NATIVE):
knotvector = sv_knotvector.generate(self.degree, len(self.points)) knotvector = sv_knotvector.generate(self.degree, len(self.points))
return SvNurbsMaths.build_curve(implementation, return SvNurbsMaths.build_curve(implementation,
...@@ -425,10 +444,29 @@ class SvCubicBezierCurve(SvCurve): ...@@ -425,10 +444,29 @@ class SvCubicBezierCurve(SvCurve):
degree = 3, knotvector = knotvector, degree = 3, knotvector = knotvector,
control_points = control_points) control_points = control_points)
def elevate_degree(self, delta=1): def elevate_degree(self, delta=None, target=None):
if delta is None and target is None:
delta = 1
if delta is not None and target is not None:
raise Exception("Of delta and target, only one parameter can be specified")
degree = self.get_degree()
if delta is None:
delta = target - degree
if delta < 0:
raise Exception(f"Curve already has degree {degree}, which is greater than target {target}")
if delta == 0:
return self
points = elevate_bezier_degree(3, self.get_control_points(), delta) points = elevate_bezier_degree(3, self.get_control_points(), delta)
return SvBezierCurve(points) return SvBezierCurve(points)
def get_bounding_box(self):
return bounding_box(self.get_control_points())
def reparametrize(self, new_t_min, new_t_max):
return self.to_nurbs().reparametrize(new_t_min, new_t_max)
def concatenate(self, curve2): def concatenate(self, curve2):
curve2 = SvNurbsMaths.to_nurbs_curve(curve2) curve2 = SvNurbsMaths.to_nurbs_curve(curve2)
if curve2 is None: if curve2 is None:
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать