Урок "Стандартні графічні процедури та функції для запам’ятовування фрагментів екрану"

Про матеріал

Розширений додатковий матеріал для вивчення теми "Комп'ютерна графіка Pascal"

Структура:

  1. Метод використання бітових графічних об'єктів для береження інформації
Перегляд файлу

Стандартні графічні процедури та функції для запам’ятовування фрагментів екрану.

 

Розглянемо ще один підхід до розв’язку задачі про падіння жовтої кульки. В цьому випадку пропонується наступний алгоритм:

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.

 

 

pdf
Додав(-ла)
Апенера Вадим
Додано
19 жовтня 2018
Переглядів
545
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку