NURBS-кривая MbNurbs3D
Класс MbNurbs3D объявлен в файле cur_nurbs3d.h.
NURBS-кривая получила название от первых букв сочетания слов NonUniform Rational B-Spline. Кривая является наследником кривой MbPolyCurve3D. Кривая описывается множеством контрольных точек SArray<MbCartPoint3D> pointList, множеством весов контрольных точек weights, узловым вектором knots, порядком сплайна degree, параметром формы кривой form и признаком периодичности кривой closed. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой.
Кривая построена на основе B-сплайнов. Узловой вектор knots представляет собой неубывающую последовательность действительных чисел и определяет область определения параметра кривой и форму кривой. Параметр формы кривой form в общем случае принимает значение ncf_Unspecified, в частных случаях он хранит информацию об исходной кривой, с которой была получена NURBS-копия. Порядок degree NURBS-кривой равен порядку разделённых разностей, по которым вычисляются B-сплайны. Пусть узловой вектор содержит knotsCount элементов, а множество контрольных точек содержит pointsCount элементов. Для непериодической NURBS-кривой количества элементов в множествах связаны равенством knotsCount = pointsCount + degree. Для периодической NURBS-кривой количество элементов в множествах связаны равенством knotsCount = pointsCount + 2 degree – 1.
В методе PointOn( double & t, MbCartPoint3D & r ) радиус-вектор кривой r описывается векторной функцией
где \(N_{j}^{\mathit{degree}}(t)\) — B-сплайны порядка degree для j-й контрольной точки pointList[j].
NURBS-кривая приведена на рис. 1:
Рис. 1
Параметр кривой t принимает значения на отрезке tmin ≤ t ≤ tmax, где tmin = knots [degree – 1], tmax = knots [knotsCount – degree]. Кривая может быть периодической. Периодическая NURBS-кривая приведена на рис. 2:
Рис. 2
Форма NURBS-кривой зависит от расположения контрольных точек, от веса контрольных точек и от значений узлового вектора. NURBS-кривая в общем случае не проходит через множество точек pointList[i], i = 0,…, pointsCount – 1. Чтобы незамкнутая NURBS-кривая проходила через крайние контрольные точки, требуется чтобы первые degree элементов и последние degree элементов узлового вектора knots совпадали. Чем больше вес контрольной точки, тем ближе к этой точке проходит кривая при прочих равных условиях.
Каждая кривая может построить свою NURBS-копию виртуальным методом NurbsCurve( const MbNurbsParameters & tParameters ).