
- •ВВЕДЕННЯ
- •Лабораторна робота № 1
- •1.1.Теоретична частина.
- •1.2. Запитання для контролю.
- •1.3. Завдання до лабораторної роботи № 1.
- •Лабораторна робота № 2
- •Лабораторна робота № 3
- •1.1.Теоретична частина.
- •1.2.Завдання до контрольної роботи № 3
- •Лабораторна робота № 4
- •1.1.Теоретична частина.
- •1.2. Запитання для контролю.
- •1.3. Запитання для контролю
- •1.4. Завдання до лабораторної роботи № 4
- •Лабораторна робота № 5
- •1.1.Теоретична частина
- •1.2 Запитання для контролю.
- •1.3.Завдання до контрольної роботи № 5
- •Лабораторна робота № 6
- •1.1.Теоретична частина
- •1.2.Запитання для контролю
- •1.3.Завдання до контрольної роботи № 6
- •Лабораторна робота № 7
- •1.1.Теоретична частина
- •1.2. Запитання для контролю
- •1.3. Завдання до лабораторної роботи№ 7
- •Лабораторна робота № 8
- •1.1.Теоретична частина
- •1.2. Запитання для контролю
- •1.3. Завдання для контрольної роботи № 8
- •Лабораторна робота № 9
- •1.1.Теоретична частина
- •Литература.
Лабораторна робота № 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 |
|
|
|
|
|
Введення |
|
Цикл введення |
|
|
|
елементів |
|
|
|
|
одномірного |
||
|
|
|
|
||
|
|
|
|
масиву |
|
|
|
|
|
(вектора) |
|
|
|
|
|
|
|
|
|
|
|
Введення |
|
Подвійний |
цикл |
|
|
елементів |
|
|
|
двовимір- |
|||
введення |
|
|
|
||
|
|
|
ного |
масиву |
|
|
|
|
|
||
|
|
|
|
(матриці) |
|
Примітка. Номер блоку можна ставити: у середині блоку, зовні блоку біля лівого кута або в розриві верхньої лінії лівого верхнього кута блоку.