русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


ЛАБОРАТОРНА РОБОТА 6


Дата додавання: 2014-11-27; переглядів: 802.


Тема: Розробка та відлагодження програм із застосуванням

модуля Graph

 

Теоретичні відомості щодо виконання лабораторної роботи

 

Щоб програмувати в графічному режимі в системі Turbo Pascal, використовується модуль Graph, який містить бібліотеку підпрограм високого рівня та такі, за допомогою яких можна працювати з бітами.

Графічні процедури та функції умовно можна поділити на сім груп:

1. Керування графічною системою.

2. Керування кольором.

3. Викреслювання та фарбування.

4. Операції з екраном і вікнами.

5. Виведення тексту.

6. Обробки помилок.

7. Видача різної інформації.

 

Керування графічною системою. Якщо в програмі застосовуються підпрограми модуля Graph, необхідно об’явити її ім’я в розділі Uses. Щоб можна було використати графічний режим, насамперед треба виконати процедуру:

InitGraph(<ім’я драйверу>,<режим>,<шлях до драйверу>);

Вона завантажує графічний драйвер і встановлює графічний режим. Програміст може сам вибирати драйвер у графічний режим або доручити системі зробити це автоматично. Для цього перед ініціалізацією параметру <ім’я драйверу> необхідно надати значення визначеної константи Detect.

Графічний драйвер може забезпечити кілька графічних режимів. Функція GetModeRange повертає кількість можливих режимів для активного графічного драйвера. Функція GetGraphMode дає відомості про поточний графічний режим, який можна змінити за допомогою процедури GetGraphMode(<режим>), а для повернення у вихідний графічний режим, що існував до графічного режиму,- за допомогою процедури RestoreCrtMode.

Процедура GrsphDefaults реініціалізує всі графічні параметри (розмір вікна, колір ліній, тощо), встановлюючи їх значення за замовчанням.

Процедура CloseGraph закриває графічний режим, звільняє пам’ять, зайняту графічним драйвером і відновлює вихідний відеорежим.

Керування кольором. Графічний екран зображується матрицею пікселів. Кожний піксел відповідає кольоровій точці екрану. Значення піксела не визначає безпосередньо колір, а є індексом у таблиці кольорів, яка називається палітрою. Елемент палітри, що відповідає значенню піксела, містить інформацію про його колір. Цей механізм непрямого визначення кольору зручний у різних ситуаціях. Якщо, наприклад, апаратура дозволяє відтворювати множину кольорів та їх відтінків, то в певний момент може бути використана лише одна їх підмножина. Кількість кольорів, якими можна оперувати одночасно - це число елементів у палітрі, тобто її розмір. Так, за допомогою адаптера VGA можна утворити на екрані 256 різних кольорів та їх відтінків, але лише 16 із них можна використовувати одночасно. Змінюючи палітру, можна змінити всі кольори на екрані, не змінюючи значень пікселів.

Функція GetMaxColor повертає найбільше можливе значення кольору для певного драйвера та режиму.

Колір фону завжди відповідає значенню піксела, що дорівнює нулю. Якщо будь-яка область зітреться, то це означає, що для всіх пікселів установлено значення нуль.

Колір ліній - це колір пікселів, якого вони набувають під час викреслювання ліній. Процедура SetColor(Color) встановлює колір ліній, де Color - можливе значення кольору піксела, тобто елемент палітри. Кольори, що застосовуються у графічному режимі відповідають кольорам текстового режиму.

Процедура SetBkColor(Color) встановлює колір фону (точніше копіює колір, що відповідає номеру кольору з палітри, в елемент із номером 0).

За допомогою процедури GetPalette отримується склад палітри: повертає розмір і кольори поточної палітри. Процедура SetPalette дає змогу змінювати окремо кожний елемент палітри, а процедура SetAllPalette - всі елементи одночасно. Формати та приклади використання цих процедур наведено у [ ].

Викреслювання та фарбування. Викреслюючи різні фігури, можна вибирати тип ліній та їх товщину - їх стиль. Процедура SetLineSetting(<стиль>,<палітра>,<товщина>) - задає товщину і тип ліній. Значення параметрів (типи і константи) для зображення ліній, визначені у модулі Graph:

{для значень параметра "стиль"}

SolidLn = 0; {неперервна лінія}

DottedLn = 1; {лінія з точок }

CenterLn = 2; {лінія з точок і тире}

DashedLn = 3; {пунктирна лінія}

UserBitLn = 4; {тип лінії, заданий користувачем}

{ для значень параметра "товщина"}

NormWidth = 1; {товщина лінії у один піксель}

ThickWidth = 3; { товщина лінії у три пікселя}

 

Установлений стиль ліній впливає на дії всіх процедур, які виводять на екран відрізки або фігури, що з них складаються.

Процедура Line(x1, y1, x2, y2) -виводить лінію між вказаними координатами поточним стилем та кольором.

Процедура LineTo(x,y) - малює лінію з поточних координат у точку з координатами (x,y).

Процедура MoveRel(dx,dy) - малює лінію відносно поточних координат ГК з приростом dx та dy пікселів. Позитивні значення dx і dy збільшують його координати, а негативні - зменшують.

Circle(x, y, <радіус>) - зображає коло з центром в (x, y) і радіусом, який треба задавати у пікселях.

Rectangle(x1, y1, x2, y2) - виводить прямокутник з координатами лівого верхнього та правого нижнього кутів.

DrawPoly(N, <координати>) - зображає ломану, що задана набором <координат> множини точок. N - кількість точок злому, які складаються з набору двокомпонентних записів типу:

PointType = Record

X, Y: Word; {координати точок зламу}

End;

 

Процедура SetFillStyle(<шаблон>,<колір>) установлює тип зафарбування та його колір . Всі дозволені значення шаблонів задані у модулі константами:

EmptyFill = 0; {суцільне штрихування кольором фона}

SolidFill = 1; {суцільне штрихування поточним кольором}

LineFill = 2; {штрихування лініями}

LtStashFill = 3; {штрихування слеш-лініями}

SlashFill = 4; {штрихування товстими слеш-лініями}

BkSlashFill = 5; {штрихування товстими зворотними слеш-лініями}

LtBkSlashFill = 6; {штрихування зворотними слеш-лініями}

HatchFill = 7; {рідка штрихова}

XHatchFill = 8; {частка штрихова}

InterLeaveFill = 9; {штрихування переривчастою лінією}

WideDotFill = 10; {штрихування рідкими точками}

CloseDotFill = 11; {штрихування частими точками}

UserFill = 12; {штрихова, що задана користувачем}

 

Заливка областей зображень здійснюється наступними процедурами:

Bar(x1, y1, x2, y2) - зображає прямокутник, внутрішня область якого залита поточним шаблоном.

Bar3D(x1, y1, x2, y2, <глибина>, <верхня плоскість>) - зображає паралелепіпед, лицева сторона якого заливається поточним шаблоном, а <глибина> - задається в пікселах, <верхня плоскість> - відображати (задається значенням True) чи ні (задається значенням False) верхню плоскість.

Sector(x,y,<початковий кут>,<кінцевий кут>, <Храдіус>, <Yрадіус>) - зображає сектор еліпсу.

PieSlice(x,y,<початковий кут>,<кінцевий кут>, <радіус>) - зображає сектор кола.

FillEllipse(x,y,<Храдиус>, <Yрадіус>) - зображає еліпс.

 

Операції з екраном і вікнами. Графічне вікно визначається процедурою SetViewPort(x1, y1, x2, y2, <clip>), в якій визначаються координати лівого верхнього та правого нижнього кутів. Після виконання цієї процедури всі операції щодо формування зображення будуть належити до поточного вікна. Якщо інформація виходить за межі вікна, й параметр <clip> має значення ClipOn, то відбудеться відсікання "зайвого" зображення на межах поточного вікна. Якщо в такому випадку параметр <clip> матиме значення ClipOff, відсікання не буде.

Для всіх графічних команд координати відлічується відносно поточного вікна.

Процедура ClearViewPort очищає поточне вікно.

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

PutPixel(x, y, <колір>) - підсвічує піксель вказаного кольору в заданій позиції.

Функція GetPixel(x, y) - повертає номер кольору пікселя в заданій позиції.

Для роботи з фрагментами зображень передбачено ряд процедур і одну функцію (мається на увазі використання відеосторінок та динамічної пам’яті). Але оскільки (вважається) більш універсальним є зберігання фрагмента зображення в динамічній пам’яті, то для цього використовуються дві процедури і одна функція для запам'ятовування у буфері та відображення прямокутних фрагментів зображення.

Функція ImageSize(x1, y1, x2, y2) - визначає розмір пам’яті у байтах, яка необхідна для збереження прямокутної області екрану.

Процедура GetImage(x1, y1, x2, y2, BipMap) - розміщує в динамічній пам’яті зображення вказаної прямокутної області (необхідної для повного збереження зображення розміром, визначеним функцією ImageSize), на яку вказує параметр BipMap - змінна, яка вказує на область пам’яті,.

Процедура PutImage(x, y, BipMap, <режим>) - уставка в координати лівого верхнього кута зображення, яке зберігається в динамічної пам’яті, куди показує параметр (покажчик) BipMap. Параметр <режим> визначає режим виводу зображення, наприклад, можна накладати зображення, що на екрані із зображенням, яке зберігається у динамічній пам’яті; можна інвертувати зображення, що зберігається у динамічній пам’яті; й подібне до того. Параметр <режим> може приймати одне з наступних значень (або ім’я константи, або її числовий еквівалент): CopyPut = 0, XorPup = 1, OrPut = 2, AndPut = 3, NotPut = 4.

Адаптери VGA дозволяють організовувати кілька графічних сторінок. За допомогою процедури SetActivePage можна встановити активну сторінку, де формуватиметься графічний образ, невидимий на екрані. Щоб змінити зображення на екрані, використовується процедура SetVisualPage, яка, перемикаючи екран на іншу область відеопам’яті, швидко змінює зображення.

Виведення тексту. Графічна бібліотека містить набір символів, зображених матрицею 8х8 точок, і кілька векторних наборів для виведення тексту в графічному режимі. У другому випадку кожний символ визначається послідовністю векторів, що вказують графічній системі, як викреслювати символи.

Векторне зображення має переваги, коли зображають символи великих розмірів, при цьому зберігаються добра роздільна здатність і якість зображення. Збільшення розмірів символів у матричному зображенні робить помітні дефекти їх зображення з низькою роздільною здатністю. Набір матричних символів завжди доступний у графічній системі. Кожний набір векторних символів міститься в окремому файлі: Trip.chr, Litt.chr, Sans.chr, Goth.chr, який треба завантажити.

Процедура SetTextStyle(<шрифт>,<орієнтація>,<розмір>) установлює набір символів (<шрифт>), їх напрям (<орієнтація>) і розмір.

Параметр (<орієнтація>) набуває одного з двох значень: HorizDir = 0 або VertDir = 1. Він визначає напрямок виведення тексту, в першому випадку - горизонтальний, в другому - вертикальний. Параметр <розмір> дозволяє регулювати розмір символів (1-10).

Процедура SetTextJustify(<по горизонталі>,<по вертикалі>) установлює вирівнювання тексту по горизонталі і вертикалі. Значення параметрів <по горизонталі> і <по вертикалі> задаються константами вирівнювання:

LeftText=0; {вліво - по горизонталі}

CenterTetx=1; {по центру - по горизонталі}

RightText=2; {вправо - по горизонталі}

BottomText=3; {вниз - по вертикалі}

TopText=4; {вверх - по вертикалі}

 

Процедура OutText(<рядок>) - виводить текст, починаючи з поточної позиції.

Процедура OutTextXY(x, y, <рядок>) - виводить текст, починаючи з позиції з координатами (x, y).

При виводі числової інформації її треба перетворити у текстову.

П р и к л а д.

{Вивід числової інформації}

Max:=55.68;

Str(Max:5:2,StrMax);

OutTextXY(100, 100, StrMax);

Функції TextHeight і TextWidth повертають відповідно висоту і ширину у пікселах текстового рядка.

Обробки помилок. У разі виникнення помилки в процесі виконання графічної процедури або функції формується її код. Функція GraphResult повертає код останньої графічної операції, за якої виникла помилка. Функція GraphErrorMsg(<результат>) перетворює результат виклику функції GraphResult в повідомлення, яке можна вивести процедурою WriteLn.. Нижче наведено деякі коди помилок та відповідні їм повідомлення:

0 - помилок немає;

-2 - немає графічного адаптеру;

-3 - файл драйверу не знайдено;

-4 - помилка в драйвері (в його коді);

-5 - не вистачає пам’яті для завантаження драйверу;

-10 - неможливий режим для вибраного драйверу;

-15 - такого драйверу немає.

 

Видача різної інформації. Для кожної групи команд існує як мінімум одна функція або процедура, що повертає деяку інформацію. Імена цих функцій і процедур починаються з префікса Get. Основні функції і процедури наведено в [ ].

П р и к л а д.

Program Example_1;

{Демонстрація роботи з відеосторінками}

Uses Crt,Graph;

Procedure Initialize;

{процедура ініціалізації графічного режиму з перевіркою результату}

Var

GraphDriver,GraphMode,ErrorCode:Integer;

Begin

GraphDriver:=DETECT;

InitGraph(GraphDriver, GraphMode,'d:\tp\bgi');

ErrorCode := GraphResult;

If ErrorCode<>grOK Then

Begin

Writeln('Ошибка графики: ',GraphErrorMsg(ErrorCode));

Halt;

End;

End;{Initialize}

Begin

Initialize;

SetGraphMode(0); {режим, який дозволяє працювати з 4-ма}

{відеосторінками}

OutTextXY(5,10,'Це відеосторінка 0');

SetActivePage(1); {активізація відеосторінки 1,}

Rectangle(10,20,130,100); {викреслювання на ній прямокутника}

OutTextXY(350,25,'Це відеосторінка 1'); {і вивід тексту}

Readln;

SetVisualPage(1); {її візуалізація}

SetActivePage(0); {активізація відеосторінки 0,}

Rectangle(50,50,250,150);

ReadLn; {викреслювання на ній прямокутника}

SetVisualPage(0);ReadLn; {її візуалізація}

CloseGraph;

End.

 

П р и к л а д

Program Example_2;

{Демонстрація переміщення фігур:

горизонтально, вертикально, діагонально}

Uses Crt,Graph;

Var

p:Pointer; {покажчик на зображення на екрані}

ch:Char;

i,j,Xm,Ym,dX,dY,x,y,ddX,ddY:Integer;

 

Procedure Initialize;

{Процедура Initialize така ж як і в програмі Example_1}

 

Procedure Ellipss;

{Формування зображення еліпсу}

Begin

SetLineStyle(0,0,3);

SetColor(Yellow);

SetFillStyle(XHatchFill,Red);

FillEllipse(31,21,30,20);

GetImage(0,0,62,42,p^);

End;{Ellipss}

 

Procedure Krug;

{Формування зображення кругу}

Begin

SetLineStyle(0,0,1);

SetColor(Yellow);

Circle(21,21,20);

SetFillStyle(CloseDotFill,Green);

FloodFill(21,21,Yellow);

GetImage(0,0,42,42,p^);

End;{Krug}

 

Begin

Initialize;

Xm:=GetMaxX;Ym:=GetMaxY;ddX:=Xm div 20;ddY:=Ym div 20;

SetBkColor(Blue);

{запит ОП для прямокутного зображення}

GetMem(p,ImageSize(0,0,62,62));

For i:=1 to 2 do

Begin {перебір фігур}

ClearDevice;

Case i of

1:Ellipss;

2:Krug;

End;{Case}

SetTextStyle(0,0,1);

OutTextXY(15,GetMaxY-50,'Для продовження - <Enter>');

ReadLn;

For j:=1 to 4 do

Begin {перебор варіантів руху}

ClearDevice;

Case j of

1:Begin x:=0;y:=Ym div 2;dX:=ddX; dY:=0; End;

2:Begin x:=Xm div 2;y:=0;dX:=0; dY:=ddY;End;

3:Begin x:=0;y:=0; dX:=ddX; dY:=ddY;End;

4:Begin x:=Xm;y:=0; dX:=-ddX;dY:=ddY;End;

End;{Case}

OutTextXY(15,GetMaxY-50,'Для закінчення - <Esc>');

Repeat

PutImage(x,y,p^,CopyPut);

Delay(1000);

{PutImage(x,y,p^,XorPut); - стирання зображення}

x:=x+dX;y:=y+dY;

Until KeyPressed or (x>Xm) or (x<0) or (y>Ym) or (y<0);

If KeyPressed Then ch:=ReadKey;

End;{For j}

End;{For i}

FreeMem(p,ImageSize(0,0,62,62)); {звільнення ОП}

CloseGraph;

End.

 

Контрольні питання

 

1. Для чого потрібна ініціалізація графіки, і з чого вона складається?

2. Як можна переключатися між режимами роботи дисплея?

3. Поясніть поняття " активної" і "видимої" сторінки в графічному режимі.

4. Як можна зберегти та відновити фрагмент екрану?

5. Як можна управляти виводом примітивів та фігур на екран дисплея?

6. Особливості виводу символьної і числової інформації у графічному режимі.

 

Завдання та пояснення щодо виконання лабораторної роботи

 

Розробити підпрограму заставки засобами модуля Graph для програми відповідно до варіанта завдання лабораторної роботи 2.

 

 


<== попередня лекція | наступна лекція ==>
Else Begin | ЛАБОРАТОРНА РОБОТА 7


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн