Кривая Эрмита MbHermit3D
Класс MbHermit3D объявлен в файле cur_hermit3d.h.
Кривая Эрмита является наследником кривой MbPolyCurve3D. Кривая описывается множеством контрольных точек SArray<MbCartPoint3D> pointList, множеством производных кривой в контрольных точках SArray <MbVector3D> vectorList, множеством значений параметра кривой в контрольных точках tList, количеством splinesCount кубических сплайнов Эрмита и признаком периодичности кривой closed. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой.
Кривая Эрмита при значении параметра tList[i], i = 0, 1, …, splinesCount, проходит через контрольную точку pointList[i] и имеет в ней производную vectorList[i]. Кривая построена на основе splinesCount сплайнов Эрмита третьей степени, которые гладко стыкуются между собой. Каждый кубический сплайн Эрмита описывает участок кривой между двумя соседними контрольными точками. Каждый кубический сплайн Эрмита определяется двумя крайними точками и двумя производными кривой в этих точках.
При вычислении радиуса-вектора точки кривой Эрмита сначала по значению параметра t кривой определяется номер i рабочего участка (номер кубического сплайна Эрмита) из условия tList[i] ≤ t ≤ tList[i+1]. Радиус-вектор кривой вычисляется как радиус-вектор найденного участка для его локального параметра w, который определяется по tList[i] и tList[i+1].
В методе PointOn( double & t, MbCartPoint3D & r ) радиус-вектор кривой r описывается векторной функцией найденного участка для его локального параметра w:
где
а tList[i] ≤ t ≤ tList[i+1].
Кривая Эрмита приведена на рисунке:
Параметр кривой t принимает значения на отрезке tmin ≤ t ≤ tmax, где tmin = tList[0], tmax = tList[splinesCount]. Кривая может быть периодической.
Форма кривой зависит от расположения контрольных точек, от производных кривой в контрольных точках и от множества tList значений параметра в контрольных точках. При построении кривой только по контрольным точкам значения параметра кривой в контрольных точках tList[i] (i = 0, 1, …, splinesCount) изменяются пропорционально расстоянию между точками, а производные vectorList[i] (i = 1, 2, …, splinesCount-1 ) вычисляются путём построения параболы, проходящей по трём соседним точкам pointList[i-1], pointList[i], pointList[i+1] при соответствующих значениях параметра tList[i−1], tList[i], tList[i+1] и вычисления производной параболы в средней точке.