API Windows реализует поддержку специфических объектов, называемых
PolyDraw
и Rectangle
), кривых Безье и функций вывода текста. Функции рисования эллипсов, окружностей и эллиптических дуг не могут быть использованы для создания траектории в Windows 9x/Me, т.к. в этих системах эллиптические кривые рисуются специальным алгоритмом, а не аппроксимируются кривыми Безье. Для создания траектории предусмотрены функции BeginPath
и EndPath
. Все вызовы графических функций, расположенные между BeginPath
и EndPath
, вместо вывода в контекст устройства будут создавать в нем траекторию.После того как траектория построена, ее можно отобразить или преобразовать. Мы не будем здесь перечислять все возможные операции с траекториями, остановимся только на преобразовании траектории в ломаную. Как уже отмечалось, все контуры траектории представляют собой набор отрезков прямых и кривых Безье. С другой стороны, при построении кривой Безье она аппроксимируется ломаной. Следовательно, вся траектория может быть аппроксимирована набором отрезков прямой. Функция FlattenPath
Отметим также некоторые другие преобразование траектории, полезные для создания графических редакторов и подобных им программ. Функция PathToRegion
WidenPath
превращает каждый контур траектории в два контура — внутренний и внешний. Расстояние между ними определяется толщиной текущего пера. Таким образом, траектория как бы утолщается. После преобразования утолщенной траектории в регион можно определить, попадает ли курсор мыши на кривую с учетом погрешности, определяемой толщиной пера.Получить информацию о точках текущей траектории можно с помощью функции GetPath
Таким образом, создав траекторию из кривой Безье (BeginPath/PoliBezier/EndPath
FlattenPath
), а затем получить координаты угловэтой ломаной (GetPath
). А каждое звено этой ломаной мы можем нарисовать произвольным стилем, используя LineDDA
. Таким образом, задача построения кривой Безье сведена к уже решенной задаче построения отрезка.В листинге 1.60 реализован метод DrawCurve
FCurve
— это поле формы типа TCurve
, в котором хранятся координаты четырех точек, образующих кривую.type
// Тип TCurve хранит координаты кривой в следующем порядке: начало,
// первую промежуточную точку, вторую промежуточную точку, конец
TCurve = array[0..3] of TPoint;
// Функция обратного вызова для LineDDA
procedure LineDrawFunc(X, Y: Integer; Canvas: TCanvas); stdcall;
begin
case CurveForm.RGroupType.ItemIndex of
// Разноцветные шарики
0: if CurveForm.FCounter mod 10 = 0 then
begin
Canvas.Pen.Style := psSolid;
Canvas.Pen.Width := 1;
Canvas.Brush.Style := bsSolid;
if CurveForm.FCounter mod 15 = 0 then Canvas.Pen.Color := clBlue
else if CurveForm.FCounter mod 15 = 5 then Canvas.Pen.Color := сlLime
else Canvas.Pen.Color := clRed;
Canvas.Brush.Color := Canvas.Pen.Color;
Canvas.Ellipse(X - 2, Y - 2, X + 3, Y + 3);
end;
// Поперечные полосы
1: it CurveForm.FCounter mod 5 = 0 then