.. role:: blue :class: blue NURBS-кривая MbNurbs3D ====================== .. _MbNurbs3D_NURВS-Curve: .. версия ядра: Класс :blue:`MbNurbs3D` объявлен в файле *cur\_nurbs3d.h*. NURBS-кривая получила название от первых букв сочетания слов NonUniform Rational B-Spline. Кривая является наследником кривой :blue:`MbPolyCurve3D`. Кривая описывается множеством контрольных точек SArray\<:blue:`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. В методе :blue:`PointOn`\( double & *t*, :blue:`MbCartPoint3D` & **r** ) радиус-вектор кривой **r** описывается векторной функцией .. math:: r(t) = \frac{\sum\limits_{j = 0}^{\mathit{pointsCount} - 1} {N_{j^{\mathit{degree}}}(t)\, \mathit{weight}[j]\, \mathbf{pointList}[j]}} {\sum\limits_{j = 0}^{\mathit{pointsCount} - 1} {N_{j^{\mathit{degree}}}(t)\, \mathit{weight}[j]}}, где :math:`N_{j}^{\mathit{degree}}(t)` — B-сплайны порядка *degree* для *j*-й контрольной точки **pointList**\[*j*\]. NURBS-кривая приведена на рис. 1: .. figure:: /MODELER/CURVES/pictures/O.4.6.1.png :width: 12cm :align: center Рис. 1 Параметр кривой *t* принимает значения на отрезке *tmin* ≤ *t* ≤ *tmax*, где *tmin* = *knots* \[*degree* – 1\], *tmax* = *knots* \[*knotsCount* – *degree*\]. Кривая может быть периодической. Периодическая NURBS-кривая приведена на рис. 2: .. figure:: /MODELER/CURVES/pictures/O.4.6.2.png :width: 12cm :align: center Рис. 2 Форма NURBS-кривой зависит от расположения контрольных точек, от веса контрольных точек и от значений узлового вектора. NURBS-кривая в общем случае не проходит через множество точек **pointList**\[i\], *i* = 0,..., **pointsCount** – 1. Чтобы незамкнутая NURBS-кривая проходила через крайние контрольные точки, требуется чтобы первые *degree* элементов и последние *degree* элементов узлового вектора *knots* совпадали. Чем больше вес контрольной точки, тем ближе к этой точке проходит кривая при прочих равных условиях. Каждая кривая может построить свою NURBS-копию виртуальным методом :blue:`NurbsCurve`\( const MbNurbsParameters & *tParameters* ).