Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 445

•  TDictionary Custom Sort  6 476

•  Fast Watermark Sources  6 267

•  3D Designer  9 217

•  Sik Screen Capture  6 605

•  Patch Maker  6 991

•  Айболит (remote control)  6 991

•  ListBox Drag & Drop  5 861

•  Доска для игры Реверси  97 024

•  Графические эффекты  7 192

•  Рисование по маске  6 486

•  Перетаскивание изображений  5 357

•  Canvas Drawing  5 736

•  Рисование Луны  5 445

•  Поворот изображения  4 974

•  Рисование стержней  3 533

•  Paint on Shape  2 801

•  Генератор кроссвордов  3 668

•  Головоломка Paletto  2 954

•  Теорема Монжа об окружностях  3 761

•  Пазл Numbrix  2 481

•  Заборы и коммивояжеры  3 166

•  Игра HIP  2 129

•  Игра Go (Го)  2 063

•  Симулятор лифта  2 438

•  Программа укладки плитки  2 111

•  Генератор лабиринта  2 581

•  Проверка числового ввода  2 261

•  HEX View  2 590

•  Физический маятник  2 202

 
скрыть

Рисование КРИВЫХ в Delphi



Автор: Dmitry Streblechenko

В: У кого-нибудь есть исходный код или какая-либо информация для рисования кривых Безье? Я должен использовать их в своем компоненте. Пожалуйста используйте для ответа мой адрес электронной почты.

О: Я делал это недавно; мне было лениво разбираться с тем, как рисовать кривые Безье с помощью Win API, поэтому я использовал функцию Polyline().

Примечание: для координатных точек я использовал реальные величины типа floating (я применял некоторый тип виртуального экрана), округляя их до целого.


PBezierPoint = ^TBezierPoint;
TBezierPoint = record
  X, Y: double;   // основной узел
  Xl, Yl: double; // левая контрольная точка
  Xr, Yr: double; // правая контрольная точка
end;

// P1 и P2 - две точки TBezierPoint, расположенные между 0 и 1:
// когда t=0 X=P1.X, Y=P1.Y; когда t=1 X=P2.X, Y=P2.Y;

procedure BezierValue(P1, P2: TBezierPoint; t: double; var X, Y: double);
var
  t_sq, t_cb, r1, r2, r3, r4: double;
begin
  t_sq := t * t;
  t_cb := t * t_sq;
  r1 := (1 - 3 * t + 3 * t_sq - t_cb) * P1.X;
  r2 := (3 * t - 6 * t_sq + 3 * t_cb) * P1.Xr;
  r3 := (3 * t_sq - 3 * t_cb) * P2.Xl;
  r4 := (t_cb) * P2.X;
  X := r1 + r2 + r3 + r4;
  r1 := (1 - 3 * t + 3 * t_sq - t_cb) * P1.Y;
  r2 := (3 * t - 6 * t_sq + 3 * t_cb) * P1.Yr;
  r3 := (3 * t_sq - 3 * t_cb) * P2.Yl;
  r4 := (t_cb) * P2.Y;
  Y := r1 + r2 + r3 + r4;
end;

Для рисования кривой Безье разделяем интервал между P1 и P2 на несколько отрезков (их количество влияет на точность воспроизведения кривой, 3 - 4 точки вполне достаточно), затем в цикле создаем массив точек, используем описанную выше процедуру с параметром t от 0 до 1 и рисуем данный массив точек, используя функцию polyline().