stringtranslate.com

Алгоритм Де Кастельжау

В математической области численного анализа алгоритм Де Кастельжо представляет собой рекурсивный метод оценки полиномов в форме Бернштейна или кривых Безье , названный в честь его изобретателя Поля де Кастельжо . Алгоритм Де Кастельжо также может быть использован для разделения одной кривой Безье на две кривые Безье при произвольном значении параметра.

Алгоритм численно устойчив [1] по сравнению с прямой оценкой полиномов. Вычислительная сложность этого алгоритма составляет , где d — число измерений, а n — число контрольных точек. Существуют более быстрые альтернативы. [2] [3]

Определение

Кривая Безье (степени , с контрольными точками ) может быть записана в форме Бернштейна следующим образом, где — базисный полином Бернштейна. Кривую в точке можно оценить с помощью рекуррентного соотношения

Тогда оценка в точке может быть оценена в операциях. Результат дается как

Более того, кривую Безье можно разделить в точке на две кривые с соответствующими контрольными точками:

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

Геометрическая интерпретация алгоритма Де Кастельжау проста.

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

Обратите внимание, что построенные промежуточные точки на самом деле являются контрольными точками для двух новых кривых Безье, обе из которых точно совпадают со старой. Этот алгоритм не только оценивает кривую в точке , но и разбивает ее на две части в точке , и предоставляет уравнения двух подкривых в форме Безье.

Интерпретация, данная выше, верна для нерациональной кривой Безье. Чтобы оценить рациональную кривую Безье в , мы можем спроецировать точку в ; например, кривая в трех измерениях может иметь свои контрольные точки и веса, спроецированные на взвешенные контрольные точки . Затем алгоритм действует как обычно, интерполируя в . Полученные четырехмерные точки можно спроецировать обратно в трехмерное пространство с перспективным разделением .

В общем случае операции над рациональной кривой (или поверхностью) эквивалентны операциям над нерациональной кривой в проективном пространстве . Такое представление в виде «взвешенных контрольных точек» и весов часто удобно при оценке рациональных кривых.

Обозначение

При выполнении вычислений вручную полезно записать коэффициенты в схеме треугольника как При выборе точки t 0 для вычисления полинома Бернштейна мы можем использовать две диагонали схемы треугольника для построения деления полинома на и

кривая Безье

Кривая Безье

При оценке кривой Безье степени n в трехмерном пространстве с n + 1 контрольными точками P i мы разбиваем кривую Безье на три отдельных уравнения , которые оцениваем по отдельности с помощью алгоритма Де Кастельжау.

Пример

Мы хотим оценить полином Бернштейна степени 2 с коэффициентами Бернштейна в точке t 0 .

Мы начинаем рекурсию с , а на второй итерации рекурсия останавливается , что является ожидаемым полиномом Бернштейна степени  2 .

Реализации

Ниже приведены примеры реализации алгоритма Де Кастельжау на различных языках программирования.

Хаскелл

deCasteljau :: Двойной -> [( Двойной , Двойной )] -> ( Двойной , Двойной )        деКастельжау т [ б ] = б    deCasteljau t coefs = deCasteljau t уменьшенный       где уменьшенный = zipWith ( lerpP t ) coefs ( хвостовые coefs )        lerpP t ( x0 , y0 ) ( x1 , y1 ) = ( lerp t x0 x1 , lerp t y0 y1 )               lerp t a b = t * b + ( 1 - t ) * a             

Питон

def  de_casteljau ( t :  float ,  coefs :  list [ float ])  ->  float : """Алгоритм Де Кастельжо.""" beta  =  coefs . copy ()  # значения в этом списке переопределяются n  =  len ( бета ) для  j  в  диапазоне ( 1 ,  n ): для  k  в  диапазоне ( n  -  j ): бета [ к ]  =  бета [ к ]  *  ( 1  -  t )  +  бета [ к  +  1 ]  *  t возврат  бета [ 0 ]

Ява

public double deCasteljau ( double t , double [] коэффициенты ) {       double [] бета = коэффициенты ;    int n = бета . длина ;    для ( int i = 1 ; i < n ; i ++ ) {          для ( int j = 0 ; j < ( n - i ); j ​​++ ) {            бета [ j ] = бета [ j ] * ( 1 - t ) + бета [ j + 1 ] * t ;             } } вернуть бета [ 0 ] ; }

Пример кода на JavaScript

Следующая функция JavaScript применяет алгоритм Де Кастельжау к массиву контрольных точек или полюсов, как их первоначально назвал Де Кастельжау, чтобы уменьшать их одну за другой до достижения точки на кривой для заданного t между 0 для первой точки кривой и 1 для последней.

функция crlPtReduceDeCasteljau ( точки , t ) {    пусть retArr = [ точки.срез ( ) ] ;      в то время как ( точки . длина > 1 ) {     пусть средние точки = [];   для ( пусть i = 0 ; i + 1 < точек . длина ; ++ i ) {         пусть ax = точки [ i ][ 0 ];   пусть y = точки [ i ][ 1 ];   пусть bx = точки [ i + 1 ][ 0 ];   пусть по = точек [ i + 1 ][ 1 ];    // а * (1-t) + b * t = а + (b - a) * tсредние точки . толкать ([ах + ( bx - ах ) * т ,      ау + ( по - ау ) * т ,      ]);} retArr . push ( средние точки ) точки = средние точки ;  }возврат retArr ; }

Например,

 вар полюсов = [[0, 128], [128, 0], [256, 0], [384, 128] ] crlPtReduceDeCasteljau (полюса, .5)

возвращает массив

 [[[0, 128], [128, 0], [256, 0], [384, 128] ], [[64, 64], [192, 0], [320, 64]], [ [128, 32], [256, 32]], [ [192, 32]], ]

Какие точки и соединяющие их отрезки изображены ниже

Промежуточные отрезки, полученные путем рекурсивного применения линейной интерполяции к соседним точкам.
Промежуточные отрезки, полученные путем рекурсивного применения линейной интерполяции к соседним точкам.

Смотрите также

Ссылки

  1. ^ Дельгадо, Х.; Майнар, Э.; Пенья, Х. М. (2023-10-01). «О точности алгоритмов типа де Кастельжау и представлениях Бернштейна». Computer Aided Geometric Design . 106 : 102243. doi : 10.1016/j.cagd.2023.102243. ISSN  0167-8396.
  2. ^ Woźny, Paweł; Chudy, Filip (2020-01-01). "Линейный геометрический алгоритм для оценки кривых Безье". Computer-Aided Design . 118 : 102760. arXiv : 1803.06843 . doi : 10.1016/j.cad.2019.102760. ISSN  0010-4485.
  3. ^ Фуда, Кьяра; Раманантоанина, Андриамахенина; Хорманн, Кай (2024). «Комплексное сравнение алгоритмов оценки рациональных кривых Безье». Dolomites Research Notes on Approximation . 17 (9/2024): 56–78. doi :10.14658/PUPJ-DRNA-2024-3-9. ISSN  2035-6803.

Внешние ссылки