АЛГОРИТМЫ

Новости

Рассылка новостей

Форум

AlgoPascal

Редактор блок-схем

Статьи

О сайте

Контакты



Содержание - Интерполяция - Построение кривой Безье

Построение кривой Безье

Вообще-то, построение кривой Безье n-ого порядка не является задачей интерполяции, поскольку эта кривая проходит только через первую и последнюю указанные точки. Тем не менее, раздел "Интерполяция" является наиболее подходящим для размещения этого алгоритма местом, поскольку некоторое сходство с задачами интерполяции есть.

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

x(t) = C 0t 0(1-t) nx + C 1*t 1*(1-t) n-1*x + C 2t 2(1-t) n-2x + ... + C nt n(1-t) 0x

Здесь x - абсцисса i-ой точки, параметр t лежит в интервало от 0 до 1. Аналогично задаются другие координаты. Такая кривая проходит через первую и последнюю точки, но не обязательно проходит через остальные.

Обычно на практике используется кривая Безье третьего порядка. В таком случае кривая, построенная по набору точек, состоит из набора кривых третьего порядка. Первая кривая строится на основе точек 0, 1, 2, 3. Вторая - на основе 3, 4, 5, 6 и так далее.

Если нашли ошибку в алгоритме - сообщите!



Реализации алгоритма на различных языках:

Реализация алгоритма на C++
Реализация алгоритма на Delphi
Реализация алгоритма на Visual Basic 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.

 


Бочканов Сергей, Быстрицкий Владимир
Copyright © 1999-2004
При поддержке проекта MANUAL.RU