Графика и мультимедиа___________________________________351

Рисование прямой линии осуществляется следующим образом. Начало рисо-
вания по событию OnMouseDown сводится к операторам:

хо = х;

YO = Y;

XI = X;

Y1 = Y;

Image3->Canvas->Pen->Mode = pmNotXor;

Image3->Canvas->Pen->Color = Imagel->Canvas->Brush->Color;

Они запоминают положение курсора в двух наборах переменных: (XO,YO) и
(XI, Y1). Зачем нужны два набора — будет сказано позднее. Затем устанавливает-
ся цвет пера и режим pmNotXor, который позволит при движении мыши стирать
изображение линии.

При событиях OnMouseMove работают следующие операторы:

// Стирание прежней линии
Image3->Canvas->MoveTo(ХО,YO) ;

Image3->Canvas->LineTo(XI,Y1) ;

// Рисование новой линии
Image3->Canvas->MoveTo(XO,YO) ;

Image3->Canvas->LineTo(X,Y);

// Запоминание новых координат конца линии
XI = X;

Y1 = Y;

В этих операциях сначала парой методов MoveTo и LineTo стирается линия в
прежнем положении, а затем такой же парой методов рисуется новая линия. По-
сле этого запоминаются новые координаты конца линии.

Попробуем разобраться, зачем все так сложно. Ведь казалось бы, что достаточ-
но всего двух операторов:

Image3->Canvas->LineTo(XO,YO) ;

Image3->Canvas->LineTo(X,Y) ;

Первый из них сотрет прежнюю линию, поскольку текущая позиция пера по-
сле рисования этой прежней линии соответствовала концу линии (тем координа-
там, которые мы храним в переменных XI, Y1). А второй оператор нарисует новую
линию. И не надо хранить никаких координат.

Так просто нельзя сделать из-за одной тонкости: метод LineTo рисует линию,
начинающуюся в текущей позиции пера и заканчивающуюся в указанной точке,
исключая эту конечную точку. Поэтому, если выполнить в режиме pmNotXor
приведенные выше операторы, то первый из них сотрет прежнюю линию, но оста-
вит нестертой точку с координатами (XO,YO) и кроме того нарисует точку в быв-
шей позиции курсора, поскольку она как конечная была исключена при рисова-
нии предыдущей линии. Таким образом, на концах линии останется «грязь» в
виде концевых точек, которая и будет тянуться за перемещающимся курсором
мыши.

Заключительные операции при событии OnMouseUp аналогичны рассмотрен-
ным выше, но дополняются переводом пера в режим ртСору, при котором рисует-
ся окончательная линия:

// Стирание прежней линии

Image3->Canvas->MoveTo(XO.YO);

Image3->Canvas->LineTo(XI,Y1) ;

// Рисование новой линии)

Image3->Canvas->Pen->Mode = pmCopy;

Image3->Canvas->MoveTo(XO.YO) ;

Image3->Canvas->LineTo(X,Y);