Реализация движения
При создании движущихся изображений используются рассмотренные геометрические преобразования: перемещение, масштабирование и поворот. Принцип создания движущихся изображений состоит в том, что изображение высвечивается на экране, затем стирается, выполняются необходимые преобразования и опять высвечивается изображение, но уже преобразованное. При многократном повторении этой процедуры получается движущееся изображение.
ПЕРЕМЕЩЕНИЕ. Для перемещения точки из позиции с координатами (X,Y) в позицию с координатами (X1,Y1) надо к координате X добавить dx единиц, а к координате Y - dy единиц:
X1=X+dX;;
Y1=Y+dY.
МАСШТАБИРОВАНИЕ
X1= Round(XC*(1-KX)+KX*X);
(7)
Y1= Round (YC*(1-KY)+KY*Y),
где (X,Y) - координаты точки исходного рисунка;
(XC,YC) - координаты центра масштабирования;
KX, KY - коэффициенты масштабирования по горизонтали и вертикали,
Округление необходимо, т.к. коэффициенты масштабирования в общем случае величины действительные. При KX >1 и KY >1 рисунок увеличивается в размерах и удаляется от центра масштабирования; при KX <1 и KY <1 рисунок уменьшается в размерах и приближается к центру масштабирования. При KX=KY угол наклона масштабируемого отрезка не меняется.
ВРАЩЕНИЕ. При перемещении точки А с координатами (X,Y) по дуге окружности с центром в точке С с координатами (XC,YC) в точку В с координатами (X1,Y1) новые координаты определяются из формулы:
X1=XC+Round((X-XC)*COS(Θ)+(Y-YC)*SIN(Θ))
Y1=YC+Round((Y-YC)*COS(Θ)-(X-XC)*SIN(Θ)),
где Θ - угол поворота (положительное направление поворота против часовой стрелки, отрицательное - по часовой стрелке);
Движение моделируется с помощью невизуального компонента Timer, который расположен на странице System палитры компонентов Delphi. Он применяется для запуска процедур, функций и событий через определенные интервалы времени. Интервал определяется значением его свойства Interval, которое подбирает пользователь. В начальный момент времени Timer не используется (его свойство Enabled равно False). Кнопка "ПУСК" активизирует этот компонент (Timer.Enabled:= True), и начинается движение. Кнопка "СТОП" меняет значение свойства Timer.Enabled на False, и движение прекращается.
|
Implementation
var x1:integer;
procedure TForm1.FormCreate(Sender: TObject); {}
Begin
x1:=0; Timer1.enabled:= false;
end;
procedure TForm1.N1Click(Sender: TObject); {включить}
Begin
Timer1.enabled:= true;
end;
Procedure ris; {рисунок}
Begin
form1.image2.canvas.rectangle(x1,10,x1+10,20);
end;
procedure TForm1.N2Click(Sender: TObject); {выключить}
Begin
Timer1.enabled:= false;
end;
procedure TForm1.Timer1Timer(Sender: TObject); {OnTimer событие}
Begin
ris;
image2.Canvas.pen.color:= clred;
image2.Canvas.brush.color:= clgreen;
x1:=x1+10;
end;
End.
Обработчики событий для мыши.
Используемые типы
type TMouseButton = (mbLeft, mbRight, mbMiddle);
тип перечислимый, какая кнопка мыши выбрана
type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
тип множество из кнопок нажатых при использовании мыши
type TmouseEvent = Procedure (Sender:Tooject; Button:TmouseButton;
<Shift>:TshiftState; X,Y:integer) of Object;
Property TControl OnMouseDoun: TmouseEvent
Свойство класса OnMouseUp :TmouseEvent
Текст программы граф редактора (работа с мышкой)
unit Unit1;
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComCtrls, Menus;
type
TForm1 = class(TForm)
Image1: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton4: TRadioButton;
RadioButton5: TRadioButton;
RadioButton3: TRadioButton;
RadioButton6: TRadioButton;
|
OpenPictureDialog1: TOpenPictureDialog;
SavePictureDialog1: TSavePictureDialog;
ColorBox1: TColorBox;
ColorBox2: TColorBox;
Label2: TLabel;
Label3: TLabel;
ColorBox3: TColorBox;
Label4: TLabel;
RadioButton7: TRadioButton;
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Implementation
{$R *.dfm}
var x1,y1,x2,y2:integer;
procedure TForm1.FormCreate(Sender: TObject);
Begin
image1.Canvas.Brush.Color:=clwhite;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
x1:=x; y1:=y;
image1.Canvas.MoveTo(x1,y1);
if radiobutton4.Checked then // залика
Begin
Image1.Canvas.brush.color:= Colorbox3.selected;
Image1.Canvas.brush.style:= bssolid;