Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MV1339.pdf
Скачиваний:
10
Добавлен:
10.02.2016
Размер:
529.51 Кб
Скачать

Лабораторна робота № 9

Графіка в мові СИ.

1.1.Теоретична частина

Графічна програма повинна розміщуватися в функції main().

Для роботи в графічному режимі спочатку потрібно виконати наступні операції: Виконати підключення до графічного режиму

#include <graphic.h>

Здійснити ініціалізацію графічної системи int gd = DETECT, gm;

initgraph (&gd,&gm,” “);

gd – графічний драйвер. Він може приймати значення: 0 або DETECT – автоматичний вибір драйвера, 1 або CGA – вибір драйвера CGA;

gm – драйвер монітора, що визначає розмір екрану.

initgraph – бібліотечна функція для ініціалізації графічного режиму. Її 3-й параметр містить шлях пошуку графічного драйвера. Якщо тут немає ніякого запису, драйвер знаходиться в поточному каталозі.

Отже, у кожній графічній програмі повинні бути присутніми наступні рядки: #include <graphics.h>

main()

{

int gd = DETECT, gm; initgraph(&gd,&gm,” “);

..........................................

}

Функції графічного режиму Описано функції відображення простих графічних об'єктів, таких як крапка, пряма,

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

Функція _setpixel()

Функція встановлює колір пиксела в заданій позиції екрана. Приведемо прототип цієї функції:

short _setpixel( short x, short y );

Колір пиксела встановлюється попередньо функцією _setcolor(). Координати пиксела задаються параметрами x і y.

Функція повертає попередній колір пиксела або -1, якщо відбулася помилка.

Функція _lineto()

Функція малює на екрані лінію. Її прототип приведений нижче: short_lineto( short x_target, short y_target );

Лінія починається в поточній крапці і закінчується в крапці, що має координати (x_target, y_target). Після відображення лінії координати поточної крапки становяться рівними (x_target, y_target). Для зміни координат поточної крапки можна скористатися функцією _lineto().

Лінія зображується в поточному кольорі (функція _setcolor()) і поточному стилі

(функція _setstyle()).

Як і усі вже розглянуті функції, функція _lineto() повертає ненульову величину, якщо вона виконалася успішно і нуль, якщо відбулася помилка.

Функція _moveto()

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

struct xycoord _moveto( short x, short y );

Нові координати поточної крапки відповідають параметрам функції (крапка з координатами (x,y)).

Функція повертає в структурі xycoord координати попередньої крапки. Структура xycoord визначена у файлі graph.h у такий спосіб:

struct xycoord {

short xcoord ; // x координата крапки short ycoord ; // y координата крапки

};

Функція _rectangle()

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

short _rectangle( short fill, short x_left, short y_top, short x_right, short y_bottom );

Прямокутник визначається координатами двох протилежних кутів (x_left,y_top) i(x_right,y_bottom);

Границя прямокутника зображується поточним кольором з використанням поточного стилю. Якщо наприклад fill дорівнює _GFILLINTERIOR, то прямокутник зафарбовується, а якщо _GBORDER - те не зафарбовується. Для зміни поточного кольору використовують функцію _setcolor().

Функція повертає ненульову величину, якщо вона виконалася успішно і нуль, якщо відбулася помилка.

Функція _ellipse()

Функція малює еліпс. Приведемо прототип цієї функції:

short _ellipse( short fill, short x_left, short y_top, short x_right, short y_bottom );

Еліпс задається прямокутником, у який він уписаний. Прямокутник визначається координатами будь-яких двох протилежних кутів (x_left,y_top) і (x_right,y_bottom). Робота функції ілюструється наcтупним чином

ELLIPSE.PCX;6";2.559";PCX

Границя еліпса зображується поточним кольором. Якщо аргумент fill функції дорівнює _GFILLINTERIOR, то еліпс зафарбовується, а якщо _GBORDER - тоне зафарбовується. Для зміни поточного кольору використовують функцію _setcolor().

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

Функція повертає не нульову величину, якщо вона виконалася успішно і нуль, якщо відбулася помилка.

Функція _arc()

Функція малює дугу еліпса.

Прототип функції _arc() має такий вигляд:

short _arc( short x_left, short y_top, short x_right, short y_bottom, short x_begin, short y_begin, short x_end, short y_end );

Еліпс задається прямокутником, у який він уписаний. Прямокутник визначається координатами будь-яких двох протилежних кутів (x_left, y_top) і (x_right, y_bottom). Дуга будується від крапки перетинання еліпса з прямою, що з'єднує центр еліпса з крапкою (x_begin, y_begin) до крапки перетинання еліпса прямою, що з'єднує його центр із крапкою (x_end, y_end) проти часової стрілки .

ARC.PCX;6";3.439";PCX

Функція повертає ненульову величину, якщо вона виконалася успішно і нуль, якщо відбулася помилка.

Функція _pie()

Функція малює сектор еліпса:

short _pie(short fill,short x_left,short y_top, short x_right, short y_bottom, short x_begin, short y_begin, short x_end, short y_end );

Еліпс задається прямокутником, у який він уписаний. Прямокутник визначається координатами будь-яких двох протилежнихх кутів (x_left, y_top) і (x_right, y_bottom). Дуга сектора будується від крапки перетинання еліпса з прямою, що з'єднує центр еліпса з крапкою (x_begin, y_begin) до крапки перетинання еліпса прямою, що з'єднує його центр із крапкою (x_end, y_end) проти часової стрілки PIE.PCX;6";3.439";PCX

Границя еліпса зображується поточним кольором. Якщо поле fill дорівнює _GFILLINTERIOR, то еліпс зафарбовується, а якщо _GBORDER - то не зафарбовується. Для зміни поточного кольору використовують функцію _setcolor().

Функція повертає ненульову величину, якщо вона виконалася успішно і нуль, якщо відбулася помилка.

Функція _setcolor()

Уграфічному режимі відеоадаптера функція _setcolor() установлює поточний колір,

використовуваний функціями _setpixel(), _lineto(), _rectangle(), _ellipse(), _arc(), _pie().

Прототип функції _setcolor() приведений нижче: short _setcolor( short color );

Параметр color повинний містити індекс кольору. За замовчуванням використовується колір з найбільшим індексом у палітрі кольорів.

Функція повертає попередній індекс кольору. У випадку помилки функція повертає -

1.

Функція _selectpalette()

Функція змінює колірну палітру для режимів _MRES4COLOR і _MRESNOCOLOR.

Уцих режимах колірна палітра містить чотири кольори - колір тла, обираний окремо і три кольори, установлюваних функцією _selectpalette(). Функція має наступний прототип:

short _selectpalette( short palette_number );

Єдиний параметр функції має різне значення в різних режимах відеоадаптера.

Урежимі _MRES4COLOR параметр palette_number вибирає одну з чотирьох можливих колірних палітр:

Ном.палітри

Індекс 1

Індекс 2

Індекс 3

(palette_number)

 

 

 

0

зелений

червоний

коричневий

1

синій

малиновий

світлосірий

2

світло-

світло-

жовтий

 

 

зелений

червоний

3

світло-

світло-

білий

 

 

синій

малиновий

У режимі _MRESNOCOLOR, для відеоадаптера

CGA з кольоровим дисплеєм використовується наступна колірна палітра:

Ном.палітри

Індекс 1

Індекс 2

Індекс 3

(palette_number)

 

 

 

0

блакитний

червоний

світло-сірий

1

світло-

світло-

білий

 

 

блакитний

червоний

Якщо замість адаптера CGA підключений EGA, то доступні три колірних палітри:

Ном. палітри

Індекс 1

Індекс 2

Індекс 3

(palette_number)

 

 

 

0

зелений

червоний

коричневий

2

світло-

світло-

жовтий

 

 

зелений

червоний

3

світло-

світло-

жовтий

 

 

синій

червоний

Функція _selectpalette() повертає номер попередньої використовуваної колірної палітри.

Функція _setlinestyle()

Функція визначає маску, використовувану при малюванні ліній функцією _lineto(): void _setlinestyle( unsigned short mask );

Єдиний параметр функції є набором з 16 біт. Кожен біт відповідає пикселу на відображуваній лінії. При цьому якщо біт параметра дорівнює одиниці, то відповідний йому пиксел на лінії відображається поточним кольором. А якщо біт параметра дорівнює нулеві, то пиксел не відображається.

Якщо функція _setlinestyle() не викликалася, то за замовчуванням маска дорівнює 0xFFFF, і, отже, усі пиксели лінії відображаються на екрані.

Функція _setviewport()

Ми будемо використовувати дві різні системи координат - фізичну і логічну. Початок фізичної системи координат знаходиться в лівому верхньому куті екрана

дисплея. Осі координат x і y спрямовані відповідно ліворуч праворуч і зверху вниз. Логічна система координат являє собою прямокутну область. Її початок координат

розташований у лівому верхньому куті прямокутної області, а осі координат спрямовані в такий спосіб: одна - вправо, інша - униз. За замовчуванням, логічна система координат збігається з фізичною. Для її зміни призначені функції _setviewport() і _setvieworg(). Переважна більшість основних графічних функцій стандартної бібліотеки трансляторів Microsoft Quick C 2.5 і C 6.0 застосовують логічну систему координат.

Прототип функції _setviewport() приведений нижче:

void _setviewport( short x_first, short y_first,short x_second, short y_second );

Параметри функції x_first, y_first і x_second, y_second задають прямокутну область екрана, у яку направляється наступний вивод графічної інформації. При цьому верхній лівий кут області є початком координат створеної логічної системи координат.

Функція _setvieworg()

Функція переміщає початок логічних координат (крапку (0, 0)) у крапку екрана, що має фізичні координати (x, y). Прототип функції має такий вигляд:

struct xycoord _setvieworg( short x, short y );

Функція повертає попереднє положення початку логічних координат щодо фізичної системи координат.

Функція _setvideomoderows()

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

Функція має наступний прототип: short_setvideomoderows(short mode,short rows);

Перший параметр функції - mode, визначає режим, у який переводиться відеоадаптер. Цей параметр може бути дорівнює однієї з наступних констант: _DEFAULTMODE, _ERESCOLOR, _ERESNOCOLOR, _HERCMONO, _HRES16COLOR, _HRESBW, _MAXCOLORMODE, _MAXRESMODE, _MRES4COLOR, _MRES16COLOR,

_MRES256COLOR,

_MRESNOCOLOR,

_ORESCOLOR, _TEXTBW40, _TEXTBW80,

_TEXTC40, _TEXTC80, _TEXTMONO, _VRES2COLOR, _VRES16COLOR. Ці константи

приведені нижче:

 

 

 

Константа

Режим

Характеристики

_TEXTBW40

 

0, 1

текстовий, 40x25, 16

 

 

 

градацій сірого кольору

_TEXTC40

 

0, 1

текстовий, 40x25, 16 квітів

_TEXTBW80

 

2, 3

текстовий, 80x25, 16

 

 

 

градацій сірого кольору

_TEXTC80

 

0, 1

текстовий, 80x25, 16 квітів

_MRES4COLOR

4, 5

графічний, 320x200, 4

 

 

 

кольору

_MRESNOCOLOR 4, 5

графічний, 320x200, 4

 

 

 

градації сірого кольору

_HRESBW

 

6

графічний, 640x200, 2

 

 

 

градації сірого кольору

_TEXTMONO

 

 

текстовий, 80x25,

 

 

 

монохромний

_HERCMONO

 

 

Hercules графічний,

 

 

 

720x348,

 

 

 

монохромний

_MRES16COLOR

0Dh

графічний, 320x200, 16

 

 

 

кольорів

_HRES16COLOR

0Eh

графічний, 640x200, 16

 

 

 

кольорів

_ERESNOCOLOR

0Fh

графічний, 640x350,

 

 

 

монохромний

_ERESCOLOR

 

10h

графічний, 640x350, 16

 

 

 

кольорів

Таблиця . Режими роботи відеоадаптерів.

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

Другий параметр може дорівнювати константі _MAXTEXTROWS. У цьому випадку встановлюється максимально можливе для даної відеосистеми число рядків. У відеоадаптера VGA це 50, EGA - 43, а в інших адаптерів - 25 рядків у текстових режимах.

Функція повертає число рядків на екрані дисплея або 0, якщо відбулася помилка (запитуваний режим не підтримується відеоадаптером).

Функція _getimage()

Функція має наступний прототип: _getimage( short x_first, short y_first, short x_second, short y_second,

char _huge *image );

Вона записує зміст прямокутної області екрана, визначеної крапками (x_first, y_first) і (x_second, y_second) у буфер, на який указує параметр image. Необхідний розмір буфера можна довідатися за допомогою функції _imagesize().

Функція _putimage()

Функція має наступний прототип: void _putimage( short x, short y, char _huge *image,

short action );

Функція поміщає піктограму, записану в буфері image, на екран. При цьому верхня ліва крапка піктограми міститься в крапці з координатами (x, y).

Параметр action визначає спосіб запису піктограми. У наступній таблиці приведені

можливі значення параметра action:

 

Констаната

Зміст

_GAND

записувана піктограма

 

накладається

 

на область екрана так, що результат

 

виходить як логічне "І" даних

 

піктограми й екрана

_GOR,

записувана піктограма

 

накладається

 

на область екрана так, що результат

 

виходить як логічне "АБО"

 

дані піктограми й екрана

_GXOR

записувана піктограма

 

накладається на область екрана так,

 

що результат виходить як

 

логічне " ЩОВИКЛЮЧАЄ

 

АБО" дані піктограми й екрана

_GPRESET

копіює піктограму на екран, при

 

цьому колір кожного пиксела

 

інвертується

_GPSET

копіює піктограму на екран, при

 

цьому колір кожного пиксела

 

зберігається

 

Таблиця . Різні способи запису піктограм.

Функція _imagesize()

Функція повертає розмір буфера (у байтах), необхідного для збереження прямокутної ділянки екрана дисплея, що задається двома діагонально протилежними крапками - (x_first, y_first) і (x_second, y_second).

long _imagesize( short x_first, short y_first, short x_second, short y_second );

Функція визначає розмір буфера по наступних формулах: width = abs(x_first-x_second) + 1;

height = abs(y_first-y_second) + 1;

size=((long)((width * bits_per_pixel + 7) / 8)*(long)height) + 4;

Величина bits_per_pixel, містить число битов відеопам'яті визначальних один пиксел. Цей параметр режиму відеоадаптера можна одержати через функцію _getvidioconfig().

Після обчислень перемінна size містить необхідний розмір буфера в байтах. Додаток Графічне позначення блоків у схемах алгоритмів

Назва блоку

Позначення

Дія

 

 

Початок-кінець

 

Початок або

 

 

кінець програми

 

 

 

 

 

 

 

 

Операція

 

 

 

введення

або

Введення (вивод)

 

виводу

без

 

 

указівки

 

 

 

пристрою

 

Арифметичний

 

Обчислити

по

 

формулі

 

 

 

 

 

 

 

 

 

 

Перевірка

 

 

 

умови:

 

Логічний

_

+

умова

виконується

 

 

+

 

 

-

умова

не

 

 

 

 

виконується

 

 

 

Завдання

 

 

 

початкового

 

Початок циклу

 

значення ПЦ і

 

 

перевірка умови

 

 

виходу з циклу

Підпрограма

 

Підпрограма

і

 

 

 

 

(або)

звертання

 

 

до неї

 

 

 

 

 

 

 

 

 

 

 

 

З'єднувачі

 

 

 

Перехід

від

 

 

N1

N2

блоку

з

 

 

номером N1 до

 

 

 

 

 

 

 

 

блоку

з

 

 

 

 

номером N2

 

 

 

 

Введення

Цикл введення

 

 

 

елементів

 

 

 

одномірного

 

 

 

 

 

 

 

 

масиву

 

 

 

 

 

(вектора)

 

 

 

 

 

 

 

 

 

 

Введення

Подвійний

цикл

 

 

елементів

 

 

двовимір-

введення

 

 

 

 

 

 

ного

масиву

 

 

 

 

 

 

 

 

(матриці)

 

Примітка. Номер блоку можна ставити: у середині блоку, зовні блоку біля лівого кута або в розриві верхньої лінії лівого верхнього кута блоку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]