Алгоритм де Кастельє

Матеріал з testwiki
Версія від 09:10, 22 травня 2022, створена imported>InternetArchiveBot (Виправлено джерел: 2; позначено як недійсні: 0.) #IABot (v2.0.8.7)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

В обчислювальній математиці алгоритм де Кастельє (або також алгоритм де Кастельжо), названий на честь його винахідника Шаблон:Нп — рекурсивний метод визначення форми поліномів Бернштейна або кривих Безьє. Алгоритм де Кастельє також може бути використаний для поділу кривої Безьє на дві частини за довільним значенням параметра (t).

Перевагою алгоритму є його вища обчислювальна стійкість у порівнянні з прямим методом.

Опис

Заданий многочлен Бернштейна B ступеня n з опорними точками β0,,βn

B(t)=i=0nβibi,n(t),

де b — базис многочлена Бернштейна, многочлен в точці t0 може бути визначений за допомогою рекурентного співвідношення:

βi(0):=βi,i=0,,n
βi(j):=βi(j1)(1t0)+βi+1(j1)t0,i=0,,nj,j=1,,n

Тоді визначення B в точці t0 може бути визначено в n кроків алгоритму. Результат B(t0) дано за:

B(t0)=β0(n).

Також, крива Безьє B може бути розділена в точці t0 на дві криві з відповідними опорними точками:

β0(0),β0(1),,β0(n)
β0(n),β1(n1),,βn(0)

Приклад реалізації

Ось приклад реалізації алгоритму де Кастельє в Haskell:

deCasteljau :: Double -> [(Double, Double)] -> (Double, Double)
deCasteljau t [b] = b
deCasteljau t coefs = deCasteljau t reduced
  where
    reduced = zipWith (lerpP t) coefs (tail coefs)
    lerpP t (x0, y0) (x1, y1) = (lerp t x0 x1, lerp t y0 y1)
    lerp t a b = t * b + (1 - t) * a

Примітки

При виконанні розрахунків вручну корисно записати коефіцієнти у вигляді трикутної схеми:

β0=β0(0)β0(1)β1=β1(0)β0(n)βn1=βn1(0)βn1(1)βn=βn(0)

При виборі точки t0 для розбиття поліному Бернштейна ми можемо використовувати дві діагоналі трикутної схеми, щоб побудувати поділ поліному

B(t)=i=0nβi(0)bi,n(t) , t[0,1]

на

B1(t)=i=0nβ0(i)bi,n(tt0) , t[0,t0]

та

B2(t)=i=0nβi(ni)bi,n(tt01t0) , t[t0,1]

Приклад

Ми хочемо розбити поліном Бернштейна 2-го ступеня з коефіцієнтами Бернштейна:

β0(0)=β0
β1(0)=β1
β2(0)=β2

у точці t0.

Почнемо рекурсію з

β0(1)=β0(0)(1t0)+β1(0)t0=β0(1t0)+β1t0
β1(1)=β1(0)(1t0)+β2(0)t0=β1(1t0)+β2t0

і друга ітерація рекурсії зупиняється у

β0(2)=β0(1)(1t0)+β1(1)t0 =β0(1t0)(1t0)+β1t0(1t0)+β1(1t0)t0+β2t0t0 =β0(1t0)2+β12t0(1t0)+β2t02,

яка очікувано є многочленом Бернштейна ступеня 2.

Крива Безьє

При оцінці кривої Безьє ступеня N в 3-вимірному просторі з N+1 опорною точкою Pi

𝐁(t)=i=0n𝐏ibi,n(t) , t[0,1]

за

𝐏i:=(xiyizi).

ми можемо розбити криву Безьє на три окремі рівняння:

B1(t)=i=0nxibi,n(t) , t[0,1]
B2(t)=i=0nyibi,n(t) , t[0,1]
B3(t)=i=0nzibi,n(t) , t[0,1],

які ми оцінюємо окремо, використовуючи алгоритм де Кастельє.

Геометрична інтерпретація

Геометрична інтерпретація алгоритму де Кастельє проста:

  • Задана крива Безьє з опорними точками P0,...,Pn. Поєднавши послідовно опорні точки з першої по останню, отримуємо ламану лінію.
  • Поділяємо кожний отриманий відрізок цієї ламаної в співвідношенні t:(1t) та з'єднуємо отримані точки. Внаслідок отримуємо ламану лінію з кількістю відрізків, меншим на один, ніж вихідна ламана лінія.
  • Повторюємо процес до тих пір, поки не отримаємо єдину точку. Ця точка і буде точкою на заданій кривій Безьє з параметром t.

Наступна ілюстрація демонструє цей процес для кубічної кривої Безьє:

Слід зауважити, що отримані в процесі побудови проміжні точки є опорними точками для двох нових кривих Безьє, що в точності збігаються з вихідною, і в сукупності дають вихідну криву Безьє. Цей алгоритм не лише визначає точку кривої для значення t, але і ділить криву на дві частини в точці, що відповідає параметру t, а також надає опис двох окремих кривих у формі Безьє (у параметричному вигляді).

Описаний алгоритм справедливий для нераціональних кривих Безьє. Для обчислення раціональних кривих в 𝐑n, можна спроектувати точку в 𝐑n+1; наприклад крива в тривимірному просторі повинна мати опорні точки {(xi,yi,zi)} і ваги {wi} спроектовані в вагові опорні точки {(wixi,wiyi,wizi,wi)}. Потім зазвичай алгоритм переходить до інтерполяції в 𝐑4. Отримані чотиривимірні точки можуть бути спроектовані назад в тривимірний простір за допомогою перспективного ділення (однорідні координати точки діляться на «вагу» {wi}).

У цілому, операції з раціональними кривими (або поверхнями) еквівалентні операціям з нераціональними кривими в проективному просторі. Представлення опорних точок як «вагових» часто буває зручно для визначення раціональних кривих.

Посилання

Див. також

Література

  • Farin, Gerald & Hansford, Dianne (2000). The Essentials of CAGD. Natic, MA: A K Peters, Ltd. ISBN 1-56881-123-3