Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

// а соседняя с ней - координаты (Х+1, Y-1). Тогда при проведении

// через эти точки наклонной линии одинарной ширины между ними

// останутся незаполненные точки, как на шахматной доске.

// Поэтому потребовалось увеличить толщину пера

Canvas.Pen.Width := 2;

Canvas.Pen.Color := clBlack;

Canvas.MoveTo(X - 5, Y - 5);

Canvas.LineTo(X + 6, Y + 6);

 end;

 //
Цепочка

 3: begin

case CurveForm.FCounter mod 15 of

0: begin

Canvas.Pen.Style := psSolid;

Canvas.Pen.Width := 1;

Canvas.Pen.Color := clBlack;

Canvas.Brush.Style := bsClear;

Canvas.Ellipse(X - 5, Y - 5, X + 6, Y + 6);

end;

2..13: Canvas.Pixels[X, Y] := clBlack;

end;

 end;

 end;

 Inc(CurveForm.FCounter);

end;

procedure TCurveForm.DrawCurve(Canvas: TCanvas);

var

 LCurve: TCurve;

 I, Size: Integer;

 PtBuf: array of TPoint;

 TpBuf: array of Byte;

 L: Extended;

begin

 // LCurve хранит координаты начала и конца кривой и ее

 // опорных точек. Если включен режим рисования по опорным

 // точкам, LCurve совпадает с FCurve, если включен режим

 // рисования по точкам кривой, опорные точки LCurve[1]

 // и LCurve[2] рассчитываются по приведенным в книге

 // формулам на основании точек FCurve

 LCurve := FCurve;

 if RGroupDrawMethod.ItemIndex = 1 then

 begin

LCurve[1].X :=

Round((-5 * FCurve[0].X + 18 * FCurve[1].X -

9 * FCurve[2].X + 2 * FCurve[3].X) / 6);

LCurve[1].Y :=

Round((-5 * FCurve[0].Y + 18 * FCurve[1].Y -

9 * FCurve[2].Y + 2 * FCurve[3]-Y) / 6);

LCurve[2].X :=

Round((2 * FCurve[0].X - 9 * FCurve[1].X +

18 * FCurve[2].X - 5 * FCurve[3].X) / 6);

LCurve[2].Y :=

Round((2 * FCurve[0].Y - 9 * FCurve[1].Y +

18 * FCurve[2].Y - 5 * FCurve[3].Y) / 6);

 end;

 //
Создаем траекторию на основе кривой

 BeginPath(Canvas.Handle);

 Canvas.PolyBezier(LCurve);

 EndPath(Canvas.Handle);

 // Аппроксимируем траекторию отрезками прямых

 FlattenPath(Canvas.Handle);

 // Получаем число точек траектории. Так как сами точки никуда

 // пока не копируются, в качестве фиктивного буфера можно указать

 // любую переменную. В данном случае - переменную I

 Size := GetPath(Canvas.Handle, I, I, 0);

 // Выделяем память для хранения координат и типов точек траектории

 SetLength(PtBuf, Size);

 SetLength(TpBuf, Size);

 // Получаем координаты и типы точек. Типы точек нас в данном случае

 // не интересуют: у первой точки будет тип PT_MOVETO,

 // а у остальных - PT_LINETO. Появление PT_MOVETO у других точек

 // невозможно, т.к. траектория содержит только один замкнутый

 // контур, состояний из кривой и соединяющей ее концы прямой.

 // Появление точек типа PT_BEZIERTO также исключено, т.к. после

 // вызова FlattenPath контур содержит только отрезки прямых.

 // Поэтому значения, записанные в TpBuf, будут в дальнейшем

 // игнорироваться

 GetPath(Canvas.Handle, PtBuf[0], TpBuf[0], Size);

 FCounter := 0;

 // Рисуем по отдельности каждый из отрезков, составляющих контур

 for I := 1 to Size - 1 do

 begin

// Вычисляем длину отрезка

L :=

Sqrt(Sqr(PtBuf[I - 1].X - PtBuf[I].X) +

Sqr(PtBuf[I - 1].Y - PtBuf[I].Y));

// Практика показала, что аппроксимированный контур может

// содержать отрезки нулевой длины - видимо, это издержки

// алгоритма аппроксимации. Так как в дальнейшем нам придется

// делить на L, такие отрезки мы просто игнорируем, т.к.

// на экране они все равно никак не отображаются

if L > 0 then begin

// переменные FDX и FDY используются только при рисовании

Поделиться:
Популярные книги

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»

Фиктивный брак

Завгородняя Анна Александровна
Фантастика:
фэнтези
6.71
рейтинг книги
Фиктивный брак

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

По дороге на Оюту

Лунёва Мария
Фантастика:
космическая фантастика
8.67
рейтинг книги
По дороге на Оюту

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Не лечи мне мозги, МАГ!

Ордина Ирина
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.00
рейтинг книги
Не лечи мне мозги, МАГ!

Измена. Право на семью

Арская Арина
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Измена. Право на семью

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Неудержимый. Книга XXI

Боярский Андрей
21. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неудержимый. Книга XXI