Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

2.1. Метод базовой точки

При программировании сложных изображений, состоящих из множества элементов, используется метод, который называется методом базовой точки. Суть этого метода заключается в следующем:

  • Выбирается некоторая точка изображения, которая принимается за базовую.

  • Координаты остальных точек отсчитываются от базовой точки.

  • Если координаты точек изображения отсчитывать от базовой в относительных единицах, а не в пикселях, то обеспечивается возможность масштабирования изображения.

Пример: На рис. 70 приведено изображение кораблика. Базовой точкой является точка с координатами (х0, у0). Координаты остальных точек отсчитываются именно от этой точки.

Рис. 70. Определение координат изображения относительно базовой точки

В листинге 2 приведен текст программы, которая выводит на экран изображение перемещающегося кораблика.

Листинг 2. Кораблик

unit titanik_; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type

TForml - class (TForm) Timerl: TTimer;

procedure TimerlTimer(Sender: TObject) ;

procedure FormActivate(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end;

var

Forml: TForml;

x,y: integer; // координаты корабля (базовой точки)

implementation {$R *.DFM)

procedure Titanik(x,y: integer; color: TColor) ;

const dx = 5; dy = 5;

var

buf: TColor;

begin

with forml.canvas do begin

buf:=pen.Color; // сохраним текущий цвет

pen.Color:=color; // установим нужный цвет

// рисуем . . .

// корпус

MoveTo(x,у);

LineTo(x,y-2*dy);

LineTo (x-t-10*dx,y-2*dy);

LineTo(x+11*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-t-13*dx,y-3*dy) ;

MoveTo (x4-5*dx, y-3*dy) ;

LineTo(x+9*dx,y-3*dy); // капитанский мостик

Rectangle (x-l-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 TForml.TimerlTimer(Sender: TObject);

begin

Titanik(x, y,forml.color); // стереть рисунок

if x < Forml.ClientWidth then x := x+5 else

begin // новый рейс

x := 0;

у := Random(SO) + 100;

end;

Titanik(x,y,clWhite); // нарисовать в новой точке

end;

procedure TForral.FormActivate(Sender: TObject);

begin

x:=0; y:=100;

Forml.Color:=clNavy;

Timer1.Interval:= 50; // сигнал таймера каждые 50 миллисекунд

end;

end.

Отрисовку и стирание изображения кораблика выполняет процедура Titanik, которая получает в качестве параметров координаты базовой точки и цвет, которым надо вычертить изображение кораблика. Если при вызове процедуры цвет отличается от цвета фона формы, то процедура рисует кораблик, а если совпадает — то "стирает". В процедуре Titanik объявлены константы dx и dy, определяющие шаг (в пикселях), используемый при вычислении координат точек изображения. Меняя значения этих констант, можно проводить масштабирование изображения.