Метод базової точки

 

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

  1. вибирається деяка точка зображення, яка приймається за базову.
  2. координати інших точок відраховуються від базової точки.
  3. якщо координати точок зображення відраховувати від базової у відносних одиницях, а не в пікселах, то забезпечується можливість збільшувати або зменшувати зображення.

На рис. 10.17 наведено зображення кораблика. Базовою точкою є точка з координатами (X 0 Y 0 ). Координати інших точок відраховуються саме від цієї точки.

Рис. 10.17. Визначення координат зображення щодо базової точки

У лістингу 10.9 наведено текст програми, яка виводить на екран зображення переміщається кораблика.

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

unit ship_;
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, що визначають крок (в пікселах), який використовується при обчисленні координат точок зображення. Змінюючи значення цих констант, можна проводити масштабування зображення.