При программировании изображений, состоящих из множества
элементов, удобно использовать метод базовой точки. Суть метода:
1) выбирается базовая точка изображения;
2) координаты остальных точек отсчитываются относительно ба-
зовой точки.
На рис. 1.9 приведен пример определения координат изображения
грузовика относительно базовой точки, координаты которой - (x, y).
Координаты остальных точек, участвующих в формировании изобра-
жения, отсчитываются от базовой точки.
Рис. 1.9. Определение координат относительно базовой точки
При использовании метода базовой точки легко обеспечить пере-
мещение сформированного изображения: надо сначала вывести изо-
бражение в исходной базовой точке, через небольшой промежуток
времени стереть изображение и снова его вывести, но уже изменив
координаты базовой точки.
Следующая программа демонстрирует перемещение грузовика по
поверхности формы от ее левой границы к правой. Изображение гру-
зовика формируется методом базовой точки. После исчезновения гру-
зовика за правой границей формы он вновь появляется слева. На фор-
ме предусмотрена кнопка, останавливающая и вновь продолжающая
движение грузовика (Стоп/ Пуск). Вид формы показан на рис. 1.10.
Рис. 1.10. Форма программы, демонстрирующей метод базовой точки
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
dx=5;
dy=5;
var
x, y: integer; //координаты базовой точки грузовика
//процедура вычерчивает грузовик
procedure lorry(x, y: integer);
var
p: array[1..6] of TPoint; //координаты точек кабины
begin
with Form1.Canvas do
begin
Pen.Width:=2;
Pen.Color:=clBlack;
//кузов грузовика
Brush.Color:=clTeal;
Rectangle(x, y-10*dy, x+20*dx, y);
34
//кабина грузовика
p[1].X:=x+22*dx; p[1].Y:=y;
p[2].X:=x+22*dx; p[2].Y:=y-20*dy;
p[3].X:=x+27*dx; p[3].Y:=y-20*dy;
p[4].X:=x+32*dx; p[4].Y:=y-12*dy;
p[5].X:=x+35*dx; p[5].Y:=y-12*dy;
p[6].X:=x+35*dx; p[6].Y:=y;
Polygon(p);
//окно кабины
MoveTo(x+27*dx, y-20*dy);
LineTo(x+27*dx, y-12*dy);
LineTo(x+32*dx, y-12*dy);
Brush.Color:=clWhite;
FloodFill(x+28*dx, y-13*dy, clBlack, fsBorder);
//колеса грузовика
Brush.Color:=clGray;
Ellipse(x+3*dx, y, x+12*dx, y+9*dy);
Ellipse(x+23*dx, y, x+32*dx, y+9*dy);
//рама грузовика
Brush.Color:=$002B7399;
Rectangle(x, y, x+35*dx, y+dy);
end;
end;
//Обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//стереть изображение грузовика
with Form1.Canvas do
begin
Pen.Color:=Color;
Brush.Color:=Color;
Rectangle(x, y-20*dy, x+35*dx, y+9*dy)
end;
//определить новую точку появления грузовика
if x
then x:=x+5
else x:=-35*dx;
lorry(x, y); //нарисовать грузовик
end;
//Обработка события Create для формы
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Width:=500; //ширина формы
Form1.Height:=250; //высота формы
Timer1.Interval:=100; //интервал времени работы таймера
Timer1.Enabled:=false; //таймер выключен
Button1.Caption:='Пуск'; //надпись на кнопке
x:=-35*dx; //начальная координата х грузовика
y:=150; //начальная координата y грузовика
end;
//Обработка события нажатия на кнопку
procedure TForm1.Button1Click(Sender: TObject);
begin
if Timer1.Enabled
then begin
Timer1.Enabled:=false;
Button1.Caption:='Пуск'
end
else begin
Timer1.Enabled:=true;
Button1.Caption:='Стоп'
end
end;
end.
Отрисовку грузовика выполняет процедура lorry(), которая по-
лучает в качестве входных параметров координаты базовой точки. Для
того чтобы стереть изображение грузовика используется метод Rectangle(),
который рисует закрашенный цветом формы прямоуголь-
ник, полностью покрывающий грузовик. В программе объявлены кон-
станты dx и dy, изменяя значения которых можно подобрать необхо-
димый масштаб грузовика.
|