procedure TLinesForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if LineDrawing and ((X <> OldX) or (Y <> OldY)) then
with Canvas do
begin
SetROP2(Handle, R2_NOT);
Line(BegX, BegY, OldX, OldY); // Стираем старую линию.
Line(BegX, BegY, X, Y); // Рисуем новую.
OldX:= X;
OldY:= Y;
end;
end;
procedure TLinesFom.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and LineDrawing then
begin
case RGroupLine.ItemIndex of
2: Canvas.Pen.Color:= clBlue;
3: begin
Canvas.Brush.Color:= clRed;
Canvas.Pen.Color:= clRed;
end;
4: Canvas.Pen.Color:= clGreen;
end;
Line(BegX, BegY, X, Y);
LineDrawing:= False;
end;
end;
Обратите внимание, что резиновая линия следует за мышью даже тогда, когда мышь выходит за пределы формы, т. е. форма получает сообщения мыши, когда курсор находится за ее пределами. Это становится возможным благодаря захвату мыши окном. Любое окно в Windows может захватить мышь для монопольного использования, и тогда все сообщения от мыши будет получать это окно, независимо от того, где находится курсор. В VCL любой визуальный компонент, у которого установлен стиль csCaptureMouse
(а у формы он по умолчанию установлен) автоматически захватывает мышь при нажатии левой кнопки и освобождает при ее отпускании, поэтому мы получаем требуемый нам эффект автоматически.
1.3.4.3. Кривые Безье
Сделаем следующий шаг — научимся рисовать произвольным стилем не только прямые, но и кривые. Проще всего это сделать с так называемыми
Теорию кривых Безье разработал П. де Кастело в 1959 году и, независимо от него, П. Безье в 1962 году. Для построения кривой Безье
Кубические кривые Безье задаются следующей формулой:
где
Одним из важнейших свойств кривой Безье является ее делимость. Если кривую разделить на две кривых в точке t = 0,5, каждая из полученных кривых также будет являться кривой Безье. На этом свойстве основывается алгоритм рисования кривых Безье: если кривая может быть достаточно точно аппроксимирована прямой, рисуется отрезок прямой, если нет — она разбивается на две кривых Безье, к каждой из которых вновь применяется этот алгоритм. Для рисования кривых Безье служат функции PolyBezier
, PolyBezierTo
и PolyDraw
.
В некоторых случаях удобно строить кривую Безье не по опорным точкам, а по точкам, через которые она должна пройти. Пусть кривая начинается в точке
Из этих уравнений, в частности, следует, что для любых четырех точек плоскости существует, и притом единственная, кривая Безье, которая начинается в первой точке, проходит при
1.3.4.4. Траектории