.. role:: blue :class: blue NURBS-поверхность MbSplineSurface ================================= .. _MbSplineSurface_NURBS_Surface: .. версия ядра: 1180ХХ Класс :blue:`MbSplineSurface` объявлен в файле *surf\_spline\_surface.h*. NURBS-поверхность (NonUniform Rational B-Spline поверхность) :blue:`MbSplineSurface` описывается контрольными точками SArray<:blue:`MbCartPoint3D`> **points**\[*i*]\[*j*], *i* = 0, 1, ..., *vcount* − 1, *j* = 0, 1, ..., *ucount* − 1, условно расположенными в узлах прямоугольной таблицы с *ucount* колонками и *vcount* строками, весами контрольных точек, заданных в таблице *weight*\[*i*]\[*j*], порядком B-сплайнов вдоль первого параметра поверхности *udegree*, порядком B-сплайнов вдоль второго параметра поверхности *vdegree*, узловым вектором вдоль первого параметра *uknots*, узловым вектором вдоль второго параметра *vknots*, признаками периодичности поверхности по первому и второму параметрам *uclosed* и *vclosed*. У поверхности есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов поверхности. Порядок B-сплайнов вдоль параметров поверхности совпадает с порядком разделённой разности, по которой вычисляются соответствующие B-сплайны. Узловые векторы *uknots* и *vknots* представляют собой неубывающие последовательности действительных чисел и определяют область определения параметров поверхности и её форму. Пусть узловой вектор *uknots* содержит *uknotsCount* элементов, а количество точек в каждой строке прямоугольной таблицы равно *ucount*. Для непериодической по первому параметру NURBS-поверхности количества элементов в множествах связаны равенством *ucount* + *degree* = *uknotsCount*. Для периодической NURBS-поверхности количество элементов в множествах связаны равенством *knotsCount* + 2 *degree* − 1 = *knotsCount*. В методе :blue:`PointOn`\( double *u*, double *v*, :ref:`MbCartPoint3D ` & **s** ) радиус-вектор поверхности **s** описывается векторной функцией .. math:: r(u, v) = \frac{\sum\limits_{i = 0}^{\mathit{\text{vcount}} - 1}{\sum\limits_{j = 0}^{\mathit{\text{ucount}} - 1}{N_i^{vdegree}(v) N_j^{udegree}(u) \mathit{\text{weight}}\lbrack i\rbrack\lbrack j\rbrack \mathbf{\text{points}}\lbrack i\rbrack\lbrack j\rbrack}}}{\sum\limits_{i = 0}^{\mathit{\text{vcount}} - 1}{\sum\limits_{j = 0}^{\mathit{\text{ucount}} - 1}{N_i^{vdegree}(v) N_j^{udegree}(u) \mathit{\text{weight}}\lbrack i\rbrack\lbrack j\rbrack}}}, где :math:`N_i^{vdegree}(v)` и :math:`N_j^{udegree}(u)` — B‑сплайны. На рис. 1 приведены отрезки, связывающие соседние контрольные точки **points**\[*i*]\[*j*]. .. figure:: /MODELER/SURFACES/pictures/O.5.22.1.png :width: 12cm :align: center Рис. 1 Рис. 1 демонстрирует условное расположение контрольных точек в узлах прямоугольной таблицы. NURBS-поверхность, построенная на тех же контрольных точках, приведена на рис. 2: .. figure:: /MODELER/SURFACES/pictures/O.5.22.2.png :width: 12cm :align: center Рис. 2 Кривые на поверхности **s**\(*const*, *v*) и **s**\(*u*, *const*) с параметрами *u* = const или *v* = const представляют собой B-кривые степени *udegree* и *vdegree* соответственно. По первому параметру поверхность имеет порядок *udegree*, а по второму параметру поверхность имеет порядок *vdegree*. Область изменения параметров непериодической NURBS-поверхности представляет собой прямоугольник: *uknots*\[*udegree* − 1] ≤ *u* ≤ *uknots*\[*ucount*], *vknots*\[*vdegree* − 1] ≤ *v* ≤ *vknots*\[*vcount*]. Поверхность может быть периодической как по первому параметру, так и по второму параметру. Для периодически замкнутой поверхности узловые векторы *uknots* и *vknots* имеют на *udegree* − 1 и *vdegree* − 1 элементов соответственно больше. Область изменения параметров периодической по обоим параметрам NURBS-поверхности представляет собой прямоугольник: *uknots*\[*udegree* − 1] ≤ *u* ≤ *uknots*\[*ucount* + *udegree* − 1], *vknots*\[*vdegree* − 1] ≤ *v* ≤ *vknots*\[*vcount* + *vdegree* − 1]. Каждая поверхность может построить свою NURBS-копию виртуальным методом :blue:`NurbsSurface`\( const MbNurbsParameters & *uParam*, const MbNurbsParameters & *vParam* ).