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

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

Жанры

О чём не пишут в книгах по 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 используются только при рисовании

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

Решала

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

Все не случайно

Юнина Наталья
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Все не случайно

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

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

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

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Real-Rpg. Еретик

Жгулёв Пётр Николаевич
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Real-Rpg. Еретик

Восход. Солнцев. Книга VI

Скабер Артемий
6. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VI

Действуй, дядя Доктор!

Юнина Наталья
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Действуй, дядя Доктор!

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд