Анализ кривых


Теоретическая сводка.

Согласно параметрическому методу кривая задаётся непрерывным отображением скалярного множества [U_min, U_max] на множество точек пространства.

Это означает, что любая точка P на кривой имеет соответствующее ей значение скалярного параметра U. Следует также помнить, что длина сегмента кривой в общем случае не равна разности параметров в ограничивающих этот сегмент точках.

Методы, связывающие параметры кривой с точками и длинами представлены в настоящем разделе.


Классы кривых.

В ZenCad существуют следующие классы реализующие методы анализа кривых:


Крайние точки и диапазон конечной кривой.

Определение концевых точек конечных кривых.

Метод endpoints возвращает объекты крайних точек. Параметры этих точек могут быть запрошены методом range.

curve.endpoints() # -> tuple[Point3, Point3]
curve.range() # -> Interval; .lower/.upper -> Scalar
crv = circle(r=5, wire=True, angle=deg(270))
s,f = crv.endpoints()
disp([crv, s, f])


curve.d0(u)

Вернуть точку, соответствующую параметру u.


curve.d1(u)

Вернуть вектор первой производной, соответствующие параметру u.

curve.lower_distance_parameter(pnt)

Вернуть параметр, соответствующий точке кривой наиболее близкой к точке pnt.


Равнораспределённые точки кривой.

Вернуть массив точек, равномерно распределённых на кривой. Параметр npnts - задаёт количество точек. Количество точек должно быть целым числом не меньше двух. Обе границы диапазона задаются вместе или обе опускаются; результат включает его концы. Равномерность относится к длине вдоль кривой, а не к параметру. Параметры umin, umax задают диапазон на множестве параметров в котором будет проведена процедура распределения.

curve.uniform(npnts, U_min, U_max) # -> list[Scalar]
curve.uniform_points(npnts, U_min, U_max) # -> list[Point3]
crv = circle(r=5, wire=True, angle=deg(270))

params = crv.uniform(8, math.pi/4, math.pi)
print([float(p) for p in params]) # [0.7853981633974483, 1.121997376282069, 1.4585965891666897, 1.7951958020513104, 2.131795014935931, 2.4683942278205517, 2.8049934407051724, 3.141592653589793]

pnts = crv.uniform_points(8, math.pi/4, math.pi)
disp(pnts + [crv])

Двумерные кривые

У Curve2 свой интерфейс: point(u) возвращает Point2, tangent(u) — Vector2 первой производной, range() — Interval. Для ограничения диапазона используйте trim(start, end). Методы d0, d1, endpoints и uniform_points, описанные выше для Edge и Curve, не входят в интерфейс Curve2.

from zencad import *

curve2 = segment2(point2(0, 0), point2(10, 0))
interval = curve2.range()
start = curve2.point(interval.lower)
end = curve2.point(interval.upper)
assert float(start.x) == 0
assert float(end.x) == 10
assert isinstance(curve2.tangent(interval.lower), Vector2)