Розширений додатковий матеріал для вивчення теми "Комп'ютерна графіка Pascal"
Структура:
Стандартні графічні процедури та функції для запам’ятовування фрагментів екрану.
Розглянемо ще один підхід до розв’язку задачі про падіння жовтої кульки. В цьому випадку пропонується наступний алгоритм:
1. намалювати бажаний об’єкт;
2. запам’ятати область екрана, з виведеним малюнком;
3. відновити екран в місці, де був малюнок (тобто стерти малюнок);
4. вивести малюнок на нове місце і т.д.
Цей підхід дуже схожий на попередній варіант, але має суттєві переваги в тому, що не потребує багаторазового перемальовування малюнку. Об’єкт створюється один раз, зберігається його копія, а потім виводиться в потрібному місці.
Для зберігання намальованого фрагмента необхідно використовувати оперативну пам’ять, причому так як ми не знаємо розміри об’єкта на початку програми, пам’ять необхідно запрошувати у системи безпосередньо під час роботи програми. Це можна зробити тільки використовуючи динамічну пам’ять за допомогою наступних підпрограм:
1. GetImage(x1,y1,x2,y2,BitMap) – зберігає образ вказаної прямокутної області екрана в динамічній області пам’яті. В цій підпрограмі
х1, y1, x2, y2 – координати лівого верхнього та правого нижнього кутів
прямокутної області екрана, образ якої ми хочемо зберегти;
BitMap – адреса області пам’яті, в якій ми зберігаємо об’єкт.
2. PutImage(x,y,BitMap,Mode) – відновлює збережений образ прямокутної області.
Тут x, y – координати верхнього лівого кута області екрана, в яку ми хочемо помістити зображення;
BitMap – адреса пам’яті, в якій було збережено зображення; Ця змінна повинна мати тип Pointer;
Mode – режим накладання зображення на екран. Режимів накладання існує 5 (від 0 до 4), але самими цікавими для нас являються CopyPut (0) – заміщення новим об’єктом старого зображення та XOR (1) – “витирання” старого об’єкта.
Крім цих основних підпрограм при використанні оперативної пам’яті для збереження об’єкта нам знадобляться ще дві. Перша – допомагає визначити об’єм необхідної пам’яті в байтах для збереження прямокутного малюнку, а друга здійснює запит у системи на відповідну область пам’яті. Їх використовують разом наступним чином:
{визначається необхідний розмір області пам’яті} Size := ImageSize(x1,y1,x2,y2);
{у системи здійснює запит на оперативну пам’ять}
GetMem(BitMap,Size);
де x1,y1,x2,y2 – координати прямокутної області екрану, де знаходиться малюнок; Size – розмір необхідної пам’яті (змінна цілого типу - integer);
BitMap – адреса оперативної пам’яті, що виділяється системою (змінна типу вказівник для збереження адреси).
Покажемо тепер, як за допомогою цих підпрограм можна побудувати об’єкт, що рухається згори вниз, на прикладі наступної задачі.
2
Код програми: uses crt,graph; const r=50; var gd,gm:integer;
Page:byte;
size:integer;
bitmap:pointer;
xc,yc,x,y:integer;
begin
gd:=vga;gm:=vgamed;
InitGraph (gd,gm,'..\bgi'); xc:=getmaxx div 2; yc:=getmaxy div 2;
x:=xc;y:=0;
SetColor (yellow);
𝟏. { SetFillStyle(1,yellow); Circle (xc,yc,r);
FloodFill(xc,yc,yellow);
I. size:=imagesize (xc-r,yc-r,xc+r,yc+r); 𝟐. { II. getmem(bitmap,size);
III. getimage(xc-r,yc-r,xc+r,yc+r,bitmap^);
repeat
SetActivePage (Page);
3. ClearDevice;
4. IV. putimage(x,y,bitmap^,1);
SetVisualPage (Page);
Page:=1-Page; Delay (1500); y:=y+1;
if y=getmaxy-2*r then y:=r;
Until keypressed; CloseGraph; end.