Сплайни – теоретичне введення

Параметричне подання сплайнів

Для того, щоб використовувати складні криві на практиці, зазвичай використовується їх параметричне уявлення. Таким чином, у будь-якої з точок на будь-якій частині кривої, що лежить між двома заданими послідовними точкамиPiіPi + 1, з координатами (x(t); y (t)) значенняtзмінюватиметься від0.0до1.0у тому випадку, якщо частина кривої будується відPiдоPi+1.

У тому випадку, якщо є задані точкиP0(x0, y0), P1(x1, y1), … Pn(xn, yn), то частина кривоїB-сплайнуміж точкамиPiіPi+1визначається як послідовність точок з координатами (x(t), y(t)) при0,0 ≤ t ≤ 1,0:.

  • x(t) = a0+ a1t + a2t2 + a3t3
  • y(t) = b0+ b1t + b2t2 + b3t3
Ці рівняння містять такі коефіцієнти:
  • a0 = (xi-1 + 4xi + xi+1)/6
  • a1 = (-xi-1 + xi+1)/2
  • a2 = (xi-1 - 2xi + xi+1)/2
  • a3 = (-xi-1 + 3xi - 3xi+1 + xi+2)/6
Коефіцієнтиb0, … b3обчислюються аналогічно за значеннямиyi-1, … yi+2. Для продуктивності алгоритму важливо, щоaiіbiобчислюються лише один раз кожного сегмента кривої.

Властивості сплайнів

Криві типуB-сплайнумають властивість безперервності навіть других похіднихx²(t) і y²(t)у точках стикування двох сусідніх сегментів кривої. Для визначення властивостей кривої в точках стикування двох сегментів розглянемо функціюx(t)та її першу та другу похідні для значеньt = 0таt = 1.

Функціяy(t)матиме аналогічні властивості.

x(0) = a0 = (xi-1 + 4xi + xi+1)/6

x(1) = a1 + a2 + a3 +a2 = (xi + 4xi+1 + xi+2)/6

Тобто значенняx(0)не дорівнює точності x-координатіxiточкиPi: воно залежить від позицій точокPi-1таPi+1. Для трьох послідовних точок на кривійA,BіCточкаBналежить сегментуABі одночасно сегментуBC.

B = x(1) = (xA + 4xB + xC)/6, деx

B - обчислене значення координатиxдля точкиB.

значення
Малюнок 1. Фрагмент сплайну. Для другого сегментаA = Pi-1, B = Pi, C = Pi+1таx

B = x(0) = (xA + 4xB + xC)/6. Однакові результати означають безперервність функціїx(t)у точціB.

Продиференціювавшиx(t)двічі, знайдемоx'(t)іx²(t):

x'(t) = a1 + 2a2t + 3a3t2; x²(t) = 2a2 + 6a3t

Підставляючи в них значенняt = 0іt = 1, знаходимо:

x'(0) = a1 = (-xi-1 + xi+1)/2; x'(1) = a1 + 2a2 + 3a3 = (-xi + xi+2)/2;

x²(0) = 2a2 = xi-1 - 2xi + xi+1; x²(1) = 2a2 + 6a3 = xi - 2xi+1 + xi+2

Тоді значення першої похідної у точціB, обчислене для першого сегмента кривої(x')

B = x'(1) = (-xA + xC)/2, збігається зі значенням першої похідної у тій самій точці, обчисленим для наступного сегмента(x')

Так само і значення другої похідної в точціB, обчислене для першого сегмента кривої(x²)

B = x²(1) = xA - 2xB + xC збігається зі значенням другої похідної у тій самій точці, обчисленим для наступного сегмента(x²)

Таким чином, не тільки сама крива, але і її перші дві похідні безперервні в кожній точці кривої, тобто вся крива є дуже гладкою.

Для розрахунку будь-якого сегмента кривої між точкамиPiтаPi+1використовуються також точкиPi-1іPi+2. Тоді, якщо є точкиP0, P1, … Pn-1 і Pn, то перший сегмент кривої розташовуватиметься між точкамиP1іP2, а останній – між точкамиPn-2іPn-1.Тобто початковою та кінцевою точками кривої будутьP1таPn-1, а неP0таPn. Тому для замкнутої кривої слід три точки на початку або наприкінці послідовності задавати двічі.