![]() |
![]() |
||||
![]() | |||||
![]() |
![]() АЛГОРИТМЫ Новости Рассылка новостей Форум AlgoPascal Редактор блок-схем Статьи О сайте Контакты |
![]() |
![]() Построение кривой БезьеВообще-то, построение кривой Безье n-ого порядка не является задачей интерполяции, поскольку эта кривая проходит только через первую и последнюю указанные точки. Тем не менее, раздел "Интерполяция" является наиболее подходящим для размещения этого алгоритма местом, поскольку некоторое сходство с задачами интерполяции есть. Кривая Безье является параметрической кривой, определенной на плоскости, но это определение легко может быть расширено для пространства большей размерности. Кривая n-ого порядка задается следующей формулой: x(t) = Cn 0t 0(1-t) nx0 + Cn 1*t 1*(1-t) n-1*x1 + Cn 2t 2(1-t) n-2x2 + ... + Cn nt n(1-t) 0xnЗдесь xi - абсцисса i-ой точки, параметр t лежит в интервало от 0 до 1. Аналогично задаются другие координаты. Такая кривая проходит через первую и последнюю точки, но не обязательно проходит через остальные. Обычно на практике используется кривая Безье третьего порядка. В таком случае кривая, построенная по набору точек, состоит из набора кривых третьего порядка. Первая кривая строится на основе точек 0, 1, 2, 3. Вторая - на основе 3, 4, 5, 6 и так далее. Если нашли ошибку в алгоритме - сообщите! Реализации алгоритма на различных языках:![]() ![]() ![]() Реализация алгоритма на AlgoPascal:unit BezierCurveUnit; interface BezierCurve; implementation (************************************************************ Построение кривой Безье. Параметры: N - число точек массиве минус один XA, YA - массивы абсцисс и ординат с номерами от 0 до N. T - параметр, положение точки на кривой. От 0 до 1. Результат: X,Y - точка на кривой ************************************************************) procedure BezierCurve( const N: Integer; XA: array of Real; YA: array of Real; const T: Real; out X: Real; out Y: Real); var I : Integer; C : Integer; P : Real; begin C:=1; for I:=0 to N do begin XA[I]:=XA[I]*C; YA[I]:=YA[I]*C; C:=((n-I)*C) div (I+1); end; P:=1; for I:=0 to N do begin XA[I]:=XA[I]*P; YA[I]:=YA[I]*P; P:=P*T; end; P:=1; for I:=N downto 0 do begin XA[I]:=XA[I]*P; YA[I]:=YA[I]*P; P:=P*(1-T); end; X:=0; Y:=0; for I:=0 to N do begin X:=X+XA[I]; Y:=Y+YA[I]; end; end; end. |
![]() |
|
|
![]() |