Кубический сплайн MbCubicSpline3D

Класс MbCubicSpline3D объявлен в файле cur_cubic_spline3d.h.

Кубический сплайн является наследником кривой MbPolyCurve3D. Кривая описывается множеством контрольных точек SArray<MbCartPoint3D> pointList, множеством вторых производных кривой в контрольных точках SArray<MbVector3D> vectorList, множеством значений параметра кривой в контрольных точках tList, максимальным значением индекса множества параметров splinesCount и признаком периодичности кривой closed. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой.

Кубический сплайн при значении параметра tList[i], i = 0, 1, …, splinesCount, проходит через контрольную точку pointList[i] и имеет в ней вторую производную vectorList[i]. Кривая построена так, что при переходе из точки pointList[i]в точку pointList[i + 1] вторая производная радиуса вектора кривой изменяется линейно от vectorList[i] до vectorList[i + 1].

При вычислении радиуса-вектора точки составной кривой сначала по значению параметра t кривой определяется номер i рабочего участка, из условия tList[i] ≤ t ≤ tList[i + 1]. Радиус-вектор кривой вычисляется по значениям pointList[i], pointList[i + 1], vectorList[i], vectorList[i + 1] найденного участка для локального параметра w, который определяется по tList[i] и tList[i + 1].

В методе PointOn( double & t, MbCartPoint3D & r) радиус-вектор кривой r описывается векторной функцией

\[r(t) = (1 - w)\mathbf{pointList}[i] + w\mathbf{pointList}[i + 1] + \left( (-2w + 3w^{2} - w^{3})\mathbf{vectorList}[i] + (-w + w^{3})\mathbf{vectorList}[i + 1] \right)\frac{(\mathit{tList}[i + 1] - \mathit{tList}[i])^{2}}{6},\]

где

\[w = \frac{t - \mathit{tList}[i]}{\mathit{tList}[i + 1] - \mathit{tList}[i]},\]

а tList[i] ≤ t ≤ tList[i + 1].

Кубический сплайн, построенный по тем же контрольным точкам, что и составная кривая Эрмита, приведён на рисунке:

../../../../_images/O.4.9.1.png

Параметр кривой t принимает значения на отрезке: tmin ≤ t ≤ tmax, где tmin = tList[0], tmax = tList[splinesCount]. Кривая может быть периодической.

Форма кривой зависит от расположения контрольных точек и от множества tList значений параметра в контрольных точках. При построении кривой только по контрольным точкам значения параметра кривой в контрольных точках tList[i], i = 0, 1, …, splinesCount, изменяются пропорционально расстоянию между точками, а вторые производные vectorList[i], i = 1, 2, …, splinesCount – 1 вычисляются путём решения системы уравнений.