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