Вы можете сделать это, создав патчи из сплайнов Catmull-Rom. Эти сплайны будут поражать каждую контрольную точку, и они непрерывны в первой производной (хотя и не во второй). Я также считаю, что с ними очень легко работать. Математика проста, и они ведут себя интуитивно с небольшими изменениями в контрольных точках.
На самом высоком уровне вам потребуется 16 точек на каждый патч (на краю вашего набора данных вы можете использовать угловые и крайние точки дважды в одном сплайне).
Сначала вам нужно будет интерполировать по точкам p [i] [j] в каждой строке матрицы 4x4, чтобы создать набор из четырех промежуточных контрольных точек q [i] . Вот грубый набросок ASCII того, что я имею в виду.
p00 p01 q0 p02 p03
p10 p11 q1 p12 p13
p20 p21 q2 p22 p23
p30 p31 q3 p32 p33
Теперь вы можете интерполировать между каждой из этих четырех промежуточных контрольных точек, чтобы найти окончательную точку сплайна на вашей поверхности.
Вот конструкция сплайна Катмулла-Рома через четыре точки. В этом примере вы интерполируете между точками p [i-1] и p [i] , используя контрольные точки с обеих сторон p [i-2] и p [i + 1] . u - коэффициент интерполяции в диапазоне от нуля до единицы. τ определяется как натяжение сплайна и влияет на то, насколько плотно ваша шлицевая поверхность соответствует вашим контрольным точкам.
| 0 1 0 0 | | p[i−2] |
|−τ 0 τ 0 | | p[i−1] |
p(u) = 1 u u2 u3 | 2τ τ−3 3−2τ −τ | | p[i] |
|−τ 2−τ τ−2 τ | | p[i+1] |
ПРИМЕЧАНИЕ: не совсем очевидно, как это сделать в графическом интерфейсе Stackoverflow, но u2 и u3 должны представлять u в квадрате и u куб соответственно.