Метод базовой точки
При программировании сложных изображений, состоящих из множества элементов, используется метод, который называется методом базовой точки. Суть этого метода заключается в следующем:
1. Выбирается некоторая точка изображения, которая принимается за базовую.
2. Координаты остальных точек отсчитываются от базовой точки.
3. Если координаты точек изображения отсчитывать от базовой в относительных единицах, а не в пикселах, то обеспечивается возможность масштабирования изображения.
На рис. 10.17 приведено изображение кораблика. Базовой точкой является точка с координатами (X0 Y0). Координаты остальных точек отсчитываются именно от этой точки.
Рис. 10.17. Определение
координат изображения относительно базовой точки
Листинг 10.9.
Кораблик
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
x,y: integer; // координаты корабля (базовой точки)
implementation
{$R *.DFM}
// вычерчивает кораблик
procedure Titanik(x,y: integer; // координаты базовой точки
color: TColor); // цвет корабля const dx = 5; dy = 5; var
buf: TColor; begin
with form1.canvas do begin
buf:=pen.Color; // сохраним текущий цвет pen.Color:=color; // установим нужный цвет // рисуем . . .
// корпус MoveTo(x,y);
LineTo(x,y-2*dy) ; LineTo (x+10*dx, y-2*dy) ; LineTo (x+ll*dx, y-3*dy) ; LineTo (x+17*dx,y-3*dy) ; LineTo (x+14*dx, y) ; LineTo (x,y) ;
// надстройка MoveTo(x+3*dx,y-2*dy) ; LineTo (x+4*dx, y-3*dy) ; LineTo (x+4*dx, y-4*dy) ; LineTo (x+13*dx,y-4*dy) ; LineTo (x+13*dx, y-3*dy) ; MoveTo(x+5*dx,y-3*dy) ; LineTo (x+9*dx, y-3*dy) ;
// капитанский мостик
Rectangle (x+8*dx, y-4*dy, x+ll*dx, y-5*dy)
// труба
Rectangle (x+7*dx, y-4*dy, x+8*dx, y-7*dy) ;
// иллюминаторы
Ellipse (x+ll*dx,y-2*dy,x+12*dx,y-l*dy) ;
Ellipse (x+13*dx, y-2*dy, x+14*dx, y-l*dy) ;
// мачта
MoveTo(.x+10*dx,y-5*dy) ; LineTo(x+10*dx,y-10*dy);
// оснастка
MoveTo(x+17*dx,y-3*dy); LineTo(x+10*dx,y-10*dy); LineTo(x,y-2*dy);
pen.Color:=buf; // восстановим старый цвет карандаша end; end;
// обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject); begin
Titanik(x,y,form1.color); // стереть рисунок if x < Form1.ClientWidth then x := x+5 else begin // новый рейс x := 0;
у := Random(50) + 100; end;
Titanik(x,у,clWhite); // нарисовать в новой точке end;
procedure TForml.FormActivate(Sender: TObject); begin
x:=0; y:=100;
Form1.Color:=clNavy;
Timerl.Interval := 50; // сигнал таймера каждые 50 миллисекунд end;
end.
Отрисовку и стирание изображения кораблика выполняет процедура Titanik, которая получает в качестве параметров координаты базовой точки и цвет, которым надо вычертить изображение кораблика. Если при вызове процедуры цвет отличается от цвета фона формы, то процедура рисует кораблик, а если совпадает — то "стирает". В процедуре Titanik объявлены константы dx и dy, определяющие шаг (в пикселах), используемый при вычислении координат точек изображения. Меняя значения этих констант, можно проводить масштабирование изображения.