В математической области численного анализа алгоритм Де Кастельжо представляет собой рекурсивный метод оценки полиномов в форме Бернштейна или кривых Безье , названный в честь его изобретателя Поля де Кастельжо . Алгоритм Де Кастельжо также может быть использован для разделения одной кривой Безье на две кривые Безье при произвольном значении параметра.
Алгоритм численно устойчив [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 ;}
^ Дельгадо, Х.; Майнар, Э.; Пенья, Х. М. (2023-10-01). «О точности алгоритмов типа де Кастельжау и представлениях Бернштейна». Computer Aided Geometric Design . 106 : 102243. doi : 10.1016/j.cagd.2023.102243. ISSN 0167-8396.
^ 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.
^ Фуда, Кьяра; Раманантоанина, Андриамахенина; Хорманн, Кай (2024). «Комплексное сравнение алгоритмов оценки рациональных кривых Безье». Dolomites Research Notes on Approximation . 17 (9/2024): 56–78. doi :10.14658/PUPJ-DRNA-2024-3-9. ISSN 2035-6803.