О чём не пишут в книгах по 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
рейтинг книги
Жребий некроманта 3
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Делегат
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Запасная дочь
Фантастика:
фэнтези
6.40
рейтинг книги
Real-Rpg. Еретик
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Восход. Солнцев. Книга VI
6. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Действуй, дядя Доктор!
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Авиатор: назад в СССР 12
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Адепт. Том 1. Обучение
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Земная жена на экспорт
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Варлорд
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00