русс | укр

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

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


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


Москвіна С. М., Грищук Т. В.


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


М Алгоритмічні мови та програмування. Основи професійного програмування.Навчальний посібник. – Вінниця: ВНТУ, 2009. – 184 с.

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

УДК 681.3.06(075.8)

 

Ó С.Москвіна, 2009

 

 

 
 
 

ЗМІСТ

 


ПЕРЕДМОВА.. 5

1 ОСНОВНІ ПРИНЦИПИ РОБОТИ З ГРАФІКОЮ НА МОВІ ПРОГРАМУВАННЯ С 7

1.1 Загальні відомості 7

1.2 Функції малювання графічних примітивів. 11

1.3 Встановлення кольорів ліній і фону. 13

1.4 Керування стилем ліній, палітрою, штриховкою.. 13

1.5 Ефекти мультиплікації 28

1.6 Робота з фрагментами зображення. 28

1.7 Керування відео сторінками. 33

1.8 Вибір шрифту і стиля. 34

1.9 Контрольні запитання. 35

1.10 Практикум з програмування. 35

2 ПРИНЦИПИ РОЗРОБКИ ГРАФІЧНИХ ЗАСТАВОК В ПРОФЕСІЙНИХ ПРОГРАМАХ 36

2.1 Загальні відомості 36

2.2 Особливості розробки статичної частини графічної заставки. 36

2.3 Особливості розробки динамічної частини графічної заставки. 40

2.4 Контрольні запитання. 48

2.5 Практикум з програмування. 49

3 ОСНОВНІ ПРИНЦИПИ СТВОРЕННЯ БАГАТОІЄРАРХІЧНОГО МЕНЮ НА МОВІ С 50

3.1 Загальні відомості 50

3.2 Способи створення робочого вікна. 51

3.3 Алгоритм створення пунктів та підпунктів меню.. 54

3.4 Правила реалізації пунктів меню.. 58

3.5 Контрольні запитання. 77

3.6 Практикум з програмування. 77

4 ОСОБЛИВОСТІ ПОБУДОВИ ГРАФІКА ФУНКЦІЇ НА АЛГОРИТМІЧНІЙ МОВІ С 78

4.1 Загальні відомості 78

4.2 Ініціалізація графіки. 81

4.3 Введення даних. 81

4.4 Алгоритм побудови графіка табличної функції 84

4.5 Створення вікна таблиці для виводу даних. 87

4.6 Контрольні запитання. 92

4.7 Практикум з програмування. 92

5 ОСНОВНІ ПРИНЦИПИ РОБОТИ З ПОТОКАМИ ДАНИХ.. 93

5.1 Загальні відомості 93

5.2 Читання і запис текстових файлів. 93

5.3 Читання і запис двійкових файлів. 96

5.4 Файли з послідовним доступом. 96

5.5 Файли з довільним доступом. 98

5.6 Передача файлів між комп’ютерами. 99

5.7 Контрольні запитання. 104

5.8 Практикум з програмування. 105

6 ОСОБЛИВОСТІ РОБОТИ З ТЕКСТОВИМИ ДАНИМИ НА МОВІ С.. 106

6.1 Загальні відомості 106

6.2 Стрічки та вказівники. 110

6.3 Стандартні функції для роботи зі стрічками (бібліотека string.h) 112

6.4 Приклади використання стандартних функцій для роботи зі стрічками 114

6.5 Функції для обробки текстової інформації 129

6.6 Контрольні запитання. 136

6.7 Практикум з програмування. 136

7 РОБОТА З БАЗАМИ ДАНИХ.. 137

7.1 Загальні відомості 137

7.2 Особливості розробки програм для роботи з базами даних
на мові С.. 138

7.3 Приклад проектування бази даних. 139

7.4 Створення файлів обробки бази даних. 142

7.5 Контрольні запитання. 157

7.6 Практикум з програмування. 158

8 ОСОБЛИВОСТІ СТВОРЕННЯ ГРАФІЧНОГО МЕНЮ НА АЛГОРИТМІЧНІЙ МОВІ С 159

8.1 Загальні відомості 159

8.2 Створення кнопок. 159

8.3 Створення графічного підменю.. 162

8.4 Створення діалогових вікон. 166

8.5 Контрольні запитання. 176

8.6 Практикум з програмування. 177

СЛОВНИК ТЕРМІНІВ.. 178

СПИСОК ЛІТЕРАТУРИ.. 192

 


ПЕРЕДМОВА

Навчальний посібник призначений для студентів спеціальності 6.050201 – «Системна інженерія», що вивчають дисципліну «Алгоритмічні мови та програмування» в другому та четвертому навчальному триместрах.

Для початку роботи студенти повинні знати:

- основи алгоритмізації і програмування задач;

- методи та алгоритми розв’язування типових задач на числах, масивах, матрицях;

- основи структурного програмування;

- синтаксис і семантику мови програмування С.

Головний шлях до оволодіння майстерністю програмування на будь-якій мові програмування – це виконання самостійних практичних завдань. Даний навчальний посібник повинен допомогти студенту на простих прикладах вдосконалити свої навички в розробці професійних програмних продуктів. Приклади задач програмування, викладені в даному посібнику, ілюструють головні аспекти виконання курсової роботи з дисципліни «Алгоритмічні мови та програмування».

В посібнику основна увага приділяється розробці графічного інтерфейсу користувача та роботі з графікою засобами структурного програмування. Сучасні технології візуального програмування, представлені такими програмними продуктами, як наприклад Microsoft Visual Studio, дозволяють розв’язувати дані задачі легко та просто, не змушуючи програміста витрачати зайві сили. Але основна мета цього посібника – це самостійне вдосконалення навиків структурного програмування для розв’язування алгоритмічних задач. Саме тому студентам пропонується виконувати свої розробки на високому рівні деталізації, не вдаючись до засобів візуального програмування.

Посібник складається з восьми розділів. В першому розділі викладено основні принципи роботи з графікою в мові програмування С. На простих прикладах студенти можуть не тільки навчитись малювати графічні примітиви, а також вдосконалити свої навички з використання функцій стандартних бібліотек середовища програмування Turbo C++.

Другий розділ посібника містить детальні інструкції по створенню професійної заставки до програмного продукту з елементами анімації.

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

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

В п’ятому та шостому розділах посібника розповідається про основи роботи з текстовими даними. Детально розглянуто питання роботи з файловими потоками даних та питання обробки текстової інформації з використанням функцій стандартної бібліотеки string.h.

В сьомому розділі викладено основи розробки професійних програм для роботи з базами даних. Робота з базами даних ґрунтується на вмінні студентів використовувати структуровані типи даних мови С, вмінні працювати з файловими потоками даних та володінні навичками обробки та представлення текстової інформації.

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

В кінці кожного розділу наведено питання для самоперевірки та практичні завдання, що допоможуть більш ґрунтовно засвоїти матеріал.

Посібник завершується словником термінів, до кожного з яких подається переклад на англійську мову та коротке тлумачення []. Вивчення наведених термінів корисно для поглиблення теоретичних знань з програмування та інформатики.

Автори посібника бажають усім студентам натхнення при вивченні дисципліни "Алгоритмічні мови та програмування" і сподіваються, що ця книга полегшить виконання завдань для самостйної роботи.


1 ОСНОВНІ ПРИНЦИПИ РОБОТИ З ГРАФІКОЮ НА МОВІ ПРОГРАМУВАННЯ С

1.1 Загальні відомості

Заголовочний файл graphics.h

Бібліотека graphics.hмістить набір функцій для забезпечення повного контролю графічними режимами різних адаптерів дисплеїв: СGА, VGAHI, EGAHI, МСGA, Hercomohi, PC 3270, ATT400HI і IBM 8514HI.Бібліотека містить більше 50 функцій: як базових (креслення ліній, кіл і т.д.) так і розширюючих можливості базових (креслення багатокутників, заповнення фігур, вивід тексту і т.д.).

Щоб запустити на виконання програму, в якій використовуються функції бібліотеки graphics.h необхідно:

1. Щоб в робочому каталозі знаходились відповідні графічні драйвери (файли з розширенням .BGI).

2. А якщо програма використовує штрихові шрифти, то необхідно щоб в робочому каталозі знаходились файли шрифтів (файли з розширенням. CHR).

3. Крім того, в настройках середовища програмування (компіляторі) потрібно задати шлях до файлу graphics.h.

Файли ВGІ і вміст файлу graphics.h

Файл BGI – це файл, що містить графічний інтерфейс (Borland Graphic Interface) фірми Borland. Biн забезпечує взаємодію програм з графічними пристроями. До початку роботи програми в графічному режимі дисплею функція initgraph() визначає тип адаптера, представленого в ПЕОМ, і завантажує в пам’ять відповідний BGI-драйвер, в якому визначені можливі режими роботи.

Функція closegraph() вивантажує графічний драйвер з пам’яті і відновлює текстовий режим роботи відеоадаптера. В бібліотеці graphics.h є функції, що дозволяють виходити з графічного режиму без вивантаження драйвера (restorecrtmode()) і повертатися назад (setgraphmode()).

Якщо в складі ПЕОМ є два монітора, то при визначенні графічних адаптерів автоматично вмикається графічний режим на тому пристрої, який дозволяє одержати найвищу якість зображення.

В робочому каталозі можуть знаходитися такі файли:

cga.bgi драйвер для ІВМСВА, МСGА;

egavga.bgi драйвер для IBM EGA, VGA;

gerc.bgi драйвер для Hercules;

att.bgi драйвер для ATIT6300\400 рядків;

pc32070.bgi драйвер для IBM 3270 PC;

ibm8514.bgi драйвер для IBM 8514.

 

Вказаний вище набір файлів потрібно мати при складанні програм, які будуть працювати практично на всіх ПЕОМ, сумісних з платформою IBM. Якщо розробка програмного забезпечення виконуєься для заданого типу графічного адаптера, то достатньо мати один файл цього адптера.

Всі процедури і функціі бібліотеки graphics.h можна розбити на 7 функціональних груп:

1. Керування графічними режимами та їх аналіз:

detectgraph(), initgraph(), closegraph(), graphdefaults(), cleardevice(), installuserdrive(), restorecrtmode(), setgraphmode(),setwritemode(),getgraphmode(),getmoderange(),getmaxmode(),getmodename(),getdrivername(),graphresult(),grapherrormsg().

2. Креслення графічних примітивів і фігур:

– управління "поточним вказівником": moveto(), moverel(),getmaxx(),getmaxy(),getx(),gety().

– малювання графічних примітивів: line(),lineto(),linerel(),arc(),getarccoords(),circle(),sector(),ellipse(),rectange(),drawpoly().

– управління стилем ліній і коефіцієнтом стиснення зображення: sellinestyle(),getlinesettings(),setaspectratio(),getaspectratio().

– управління кольором і шаблоном заповнення: setcolor(), getcolor(), setbkcolor(), getbkcolor(), getmaxcolor(), getpalette(), getpalettesize(), getdefaultpalette(), setpalette(), setallpalette(), setrgbpalette(), setfillstyle(), setfillpattern(), getfillpattern(), getfillsettings(), fillpoly(), fillellipse(), floodFill(), pieslice(), bar(), bar3d().

3. Виконання бітових операцій: putpixel(),getpixel(),imagesize(),getimage(),putimage().

4. Управління відео сторінками: setactivepage(),setvisualpage().

5. Управління графічними вікнами: setviewport(),getviewsettings(),clearviewport().

6. Управління виводом тексту: installuserfont(),outtext(),outtextxy(),settextstyle(),settextjustity(),setusercharsize(),gettextsettings(),textheight(),textwidth().

Функція ініціалізації:

initgraph(int gdriver[тип адаптеру], int gmode[режим графіки], char[30] driverpath[шлях до драйверу ])

 

В бібліотеці graphics.h визначені сталі для задання виду графічного адаптеру gdriver перед викликом функції initgraph():

DETECT=0 автовизначення;

CGA=1 адаптер CGA;

MCGA=2 адаптер MCGA;

EGA=3 адаптер EGA на 256 К;

EGA64=4 адаптер EGA на 64 К;

EGAMONO=5 EGA з моно-дісплеем;

IBM8514=6 адаптер 8514;

Herc Mono=7 адаптер Hercules;

ATT400=8 адаптер для ПОЕМ AT8T;

VGA=9 адаптер VGA;

PC3270=10 адаптер 3270;

Current Driver=-128 для GET ModeRANGE.

Якщо параметр gdriver=detect, то система вмикається в режим автовизначення. Якщо параметр gdriver містить номер конкретного адаптера, то і другий параметр gmode повинен приймати значення автоматично (номер режиму, дозволеного при даному адаптері). Якщо параметр driverpath ="", то драйвери повинні знаходитися в поточному каталозі (альтернативно можна вказати шлях до драйверів, наприклад, С:\Study\TC\BGI\).

 

Лістинг 1.1. Приклад виклику функції ініціалізації, що використовується найчастіше

 

#include <graphics.h>

 

int main () {

int gdriver, gmode; // gdriver – для графічного драйверу,

//gmode – для графічного режиму

gdriver=DETECT; // режим автовизначення

initgraph (&gdriver,&gmode,""); // ініціалізація графіки

closegraph (); // вивантаження графічного драйверу з

//пам’яті

return 0;

}

 

Лістинг 1.2. Процедура ініціалізації графічного режиму з врахуванням обробки помилок ініціалізації

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<graphics.h>

void main()

{

int gdriver=DETECT, gmode, errorcode;

initgraph(&gdriver,&gmode,””);

errorcode=graphresult(); // результат ініціалізації

/* якщо при ініціалізації виникла помилка */

if (errorcode!=grOk)

{ printf(“Помилка графіки:

%s\n”,grapherrormsg(errorcode));

printf(“Натисніть будь-яку клавішу:”);

getch();

exit(1);

}

line(0,0,getmaxx(),getmaxy());// робота з графікою(маювання

//лінії)

getch(); // затримка екрану (до натиснення будь-якої

//клавіші)

closegraph();

return 0;

}

Якщо у робочому каталозі не знайдено відповідних графічних драйверів (файлів з розширенням .BGI), то на екрані з’явиться таке вікно:

Рисунок 1.1 – Зображення вікна при помилці

 

А ось що з’явиться на екрані при успішному виконанні програми:

Рисунок 1.2 – Зображення вікна при успішному виконанні програми

 

Очищеня графічного режиму виконується функцією cleardevice(). Дана функція очищає графічний екран і встановлює вказівник позиції в положення (0,0). В прикладі 1.3 показана організація переходу з графічного режиму в текстовий і в зворотному напрямку (зручно використовувати в складних прикладних програмах, ща працюють в цих режимах).

 

Лістинг 1.3. Перехід з графічного режиму в текстовий

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int x,y;

clrscr ();

initgraph(&gdriver, &gmode, "");

errorcode=graphresult();

if (errorcode!=grOk) {

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

x=getmaxx ()/2;

y=getmaxy ()/2;

// виведення повідомлення на екран

settextjustify (CENTER_TEXT, CENTER_TEXT);

outtextxy (x,y, "Press any key for exit graphic's mode...");

getch ();

restorecrtmode (); // перехід в текстовий режим

// виведення повідомлення

printf ("TEXT MODE\n");

printf ("Press any key for return graphic's mode...");

getch ();

// повернення в графічний режим

setgraphmode(getgraphmode());

// виведення повідомлення

settextjustify (CENTER_TEXT, CENTER_TEXT);

outtextxy (x,y,"GRAPHICS MODE");

outtextxy (x,y+textheight ("W"), "Press any key for exit...");

getch ();

closegraph ();

return 0;

}

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

 

1.2 Функції малювання графічних примітивів

Лінії і точки:

– функція виводу лінії (відрізка) на екран (в поточному кольорі і стилі) line (int x1, int y1, int x2, int y2), де (х1,у1) – координати початку, а (х2, у2) – координати кінця відрізка;

– функція виводу лінії з поточної точки в точку з заданими координатами: lineto (int x, int y); (відносно поточної позиції). Положення поточного вказівника приймається за початок координат (0,0) і вказується місце розташування кінця відрізка;

– функція виводу лінії з поточного положення вказівника до положення заданого приростом його координат linerel (int dx, int dy), де dx, dy - приріст координат нового положення вказівника; вивід точки за координатами (х, у) заданого кольору – putpixel (int x, int y, int color).

Кола, еліпси, дуги:

– для креслення кіл використовується функція circle (int x, int y, int radius);де х, у - координати центра кола, radius – радіус кола;

– креслення дуги радіуса radius із центром з координатами (х,у) від кута stangle до endangle (в градусах): arc (int x, int y, int stangle, int endangle, int radius).

– креслення еліптичної дуги з аналогічними параметрами ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);де xradius і yradius – розміри горизонтальної та вертикальної півосей відповідно.

Положення напрямку вісі х (зліва-направо) приймають за 0 градусів, від'ємний напрямок вісі у – за 90 градусів, так як проти годинникової стрілки.

Побудова прямокутників і ламаних:

– креслення прямокутника: rectangle (int left, int top, int right, int bottom), де(left, top), (right, bottom) – координати початку і кінця діагоналі. Прямокутник малюється з використанням поточного кольору і поточного стилю ліній;

– функція bar (int left, int top, int right, int bottom) малює прямокутник, внутрішня частина якого залита за поточним шаблоном. Вона використовується в діловій графіці для побудови стовбчастих діаграм;

– функція побудови паралелепіпеда – bar3d (int left, int top, int right, int bottom, int depth, int topflag).

 

Побудова ламаних

Щоб побудувати фігури з більшою кількістю вершин використовують функцію drawpoly(int numpoints, const int *polypoints).

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

Параметр numpoints визначає кількість точок, за якими будується ламана (при чому, якщо необхідно намалювати замкнений багатокутник з N вершинами, то значення кількість точок повинно бути на 1 більше N, n-координата (N + 1)-ої точки повинна бути така ж, як координата першої).

 

1.3 Встановлення кольорів ліній і фону

Різні адаптери підтримують різну кількість кольорів, які виводять одночасно на екран в графічному режимі, але для всіх BGI драйверів ця кількість обмежена діапазоном 0...15:

Blackчорний-0;

blueсиній-1;

grеenзелений-2;

суаnблакитний-3;

rеdчервоний-4;

magentaфіолетовий-5;

brownкорічневий-б;

lіghtgrауяскраво-сірий-7;

darkgrеутемносірий-8;

lightblueяскраво-синій-9;

lіghtgreen яскраво-зелений-10;

lightcyalяскраво-блакитний-11

lightredяскраво-червоний-12;

lightmagentaяскраво-фіолетовий-13;

ye11оwжовтий-14;

whiteбілий-15.

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

На екрані завжди розрізняють колір фона і колір ліній. Всі функції креслення фігур, якщо не містять в собі явного встановлення кольору, малюють фігури кольором ліній (як символи в текстовому режимі). Цей колір встановлюється функцією setcolor(int color).Колір фона встановлюється функцією setbkcolor(int color).Після використання цієї функції колір фона екрана одразу ж змінюється на заданий, параметр color<=getmaxcolor(). За умовчанням колір фону = 0 (Black).

 

1.4 Керування стилем ліній, палітрою, штриховкою

При кресленні лінії можна змінювати такі параметри:

- товщину лінії;

- тип лінії (пунктирні лінії, суцільні тощо).

 

В бібліотеці graphics.h визначені такі типи і сталі стилів зображених ліній:

void setlinestyle(int linestyle, unsigned upattern, int thickness);

linestyle – стиль

upattern – шаблон

thickness – товщина

 

Для значень параметра LineStyle:

SOLID_LINE=0суцільна лінія (візерунок відсутній);

DOTTED_LINE=1 крапкова лінія-суцільна штрихова;

CENTER_LINE=2 штрих пунктирна лінія;

DASHED_LINE=3 пунктирна лінія;

USERBIT_LINE=4 тип лінії заданий дійсним шаблоном.

Для значень параметра Thickness:

NORM_WIDTH=1 товщина лінії в 1 піксель;

THICK_WIDTH=3 товщина лінії в 3 пікселя.

 

Отримати інформацію про поточний стиль ліній можна за допомогою функції:

getlinesettings(struct linesettingstype far *lineinfo);

 

Лістинг 1.4. Малювання ліній різних типів

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <string.h>

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int style, midx, midy, userpat;

char stylestr [40];

/* масив назв стилів ліній */

char *lname[]={

"SOLID_LINE",

"DOTTED_LINE",

"CENTER_LINE",

"DASHED_LINE",

"USERBIT_LINE"

};

clrscr (); // функція очищення екрану

initgraph (&gdriver, &gmode, "");

errorcode=graphresult();

if (errorcode!=grOk) {

printf ("Graphics error: %s\n", grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

midx=getmaxx ()/2;

midy=getmaxy ()/2;

// вибір палітри

userpat=1;

for (style=SOLID_LINE; style<=USERBIT_LINE; style++) {

// вибір стилю ліній

setlinestyle (style, userpat, 1);

// конвертація зміної style в тип стрінг

strcpy (stylestr, lname[style]);

// рисування лінії

line (0,0, midx-10, midy);

// рисування прямокутника

rectangle (0,0, getmaxx (), getmaxy ());

// виведення повідомлення

outtextxy (midx, midy, stylestr);

getch ();

cleardevice();

}

closegraph ();

return 0;

}

Рисунок 1.3 – Малювання суцільної лінії

Рисунок 1.4 – Малювання лінії з точок

 

Лістинг 1.5. Малювання кіл за заданими координатами

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

int main(void)

{ int gdriver = DETECT, gmode, errorcode;

int midx, midy;

int radius = 100;

/* ініціалізація графіки */

initgraph(&gdriver, &gmode, "");

/* результат ініціалізації */

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

setcolor(getmaxcolor());

//функція малювання кола

circle(midx, midy, radius);

getch();

closegraph();

return 0;

}

Рисунок 1.5 – Зображення виконуючого файлу для прикладу 1.5

 

Лістинг 1.6. Використання генератора випадкових чисел для малювання прямокутників з різною товщиною контура

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

int main () {

int gdriver=DETECT, gmode, errorcode;

int X1,Y1,X2,Y2;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk) {

printf ("Graphics error: %s\n", grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

do {

getmaxcolor ();

setcolor (WHITE);

setlinestyle (random(4),0,random(10));

X1=random(getmaxx()); Y1=random(getmaxy());

X2=X1+random(getmaxx()); Y2=Y1+random(getmaxy());

if (X2>getmaxx()) X2=getmaxx();

if (Y2>getmaxy()) Y2=getmaxy();

rectangle (X1,Y1,X2,Y2);

delay(100);

} while (!kbhit());

return 0;

}

Рисунок 1.6 – Зображення виконуючого файлу для прикладу 1.6

 

Лістинг 1.7. Малювання дуги

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int maxX,x,y;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

maxX=getmaxx();

y=10;

for (x=25;x<maxX-75;x++)

{

setcolor (x%16);

arc (x,y,y%360,x%360,x/10);

y+=x%2;

}

getch();

closegraph ();

return 0;

}

 

Рисунок 1.7 – Зображення виконуючого файлу для прикладу 1.7

 

Лістинг 1.8. Малювання заповненого прямокутника

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int x1, y1, x2, y2;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

x1=getmaxx()/2;

y1=getmaxy()/4;

x2=x1+25;

y2=y1*2;

setfillstyle (1,3);

bar (x1,y1,x2,y2);

getch ();

closegraph ();

return 0;

}

 

Рисунок 1.8 – Зображення виконуючого файлу для прикладу 1.8

Лістинг 1.9. Малювання прямокутного паралелепіпеда

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

 

#define FALSE 0

#define TRUE 1

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int x1,y1,x2,y2,depth,top;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

x1=getmaxx()/2;

y1=getmaxy()/4;

x2=x1+25;

y2=y1*2;

depth=10;

top=TRUE;

setfillstyle (1,3);

bar3d (x1,y1,x2,y2,depth,top);

getch ();

closegraph ();

return 0;

}

 

Рисунок 1.9 – Зображення виконуючого файлу для прикладу 1.9

Лістинг 1.10.Програма набір еліпсів різних розмірів та кольорів

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <math.h>

#include <time.h>

int main () {

int gdriver=DETECT, gmode, errorcode;

int xmax, ymax, radius;

randomize ();

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

xmax=getmaxx();

ymax=getmaxy();

radius=10;

while (radius<ymax/2)

{

setcolor (1+abs(random(getmaxcolor())));

ellipse (xmax/2, ymax/2,0,360,radius,50);

ellipse (xmax/2, ymax/2,0,360,50,radius);

radius+=10;

}

getch();

closegraph ();

return 0;

}

Рисунок 1.10 – Зображення виконуючого файлу для прикладу 1.10

 

Лістинг 1.11. Малювання закрашених еліпсів

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <time.h>

int main () {

int gdriver=DETECT, gmode, errorcode;

int x,direction,count,xmax,ymax;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

xmax=getmaxx();

ymax=getmaxy();

x=20;

direction=1; count=5;

randomize ();

setcolor (WHITE);

while (!kbhit())

{

if ((x>xmax-50)||(x<=0))

{

direction=1;

count+=5;

}

setfillstyle(random(12),

1+abs(random(getmaxcolor())));

fillellipse (x,ymax/2, count+random(xmax/6),

count+random(ymax/4));

x+=(50-direction);

}

getch();

closegraph ();

return 0;

}

 

Лістинг 1.12.Креслення лінії

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <dos.h>

 

int main () {

int gdriver=DETECT, gmode, errorcode;

int cmax,xmin,ymin,xmax,ymax;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch();

exit (1);

}

cmax=getmaxcolor();

xmax=getmaxx();

ymax=getmaxy();

xmin=0;

ymin=0;

while ((xmin<xmax)||(ymin<ymax))

{

delay (25);

setcolor(random(cmax));

line(xmin,ymin,xmax,ymin);

line(xmin,ymax,xmax,ymax);

xmin++;

ymin++;

xmax--;

ymax--;

}

getch();

closegraph ();

return 0;

}

 

Рисунок 1.11 – Зображення виконуючого файлу для прикладу 1.12

 

Лістинг 1.13.Креслення лінії щодо поточної позиції

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <time.h>

int main () {

int gdriver=DETECT, gmode, errorcode;

int cmax,xmax,ymax,color;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

cmax=getmaxcolor();

xmax=getmaxx();

ymax=getmaxy();

randomize();

while (!kbhit())

{

moveto(0,0);

color=1+random(cmax);

while (xmax>1)

{

setcolor(random(color));

linerel(xmax,0);

linerel(0,ymax);

linerel(-xmax,0);

linerel(0,-ymax);

xmax-=2;

ymax-=2;

moveto(getx()+1,gety()+1);

}

}

getch();

closegraph ();

return 0;

}

 

Рисунок 1.12 – Зображення виконуючого файлу для прикладу 1.13

 

Лістинг 1.14. Формування ефекта мультиплікації

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <dos.h>

int main () {

int gdriver=DETECT, gmode, errorcode;

int dx,dy,x,y,maxx,maxy;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk)

{

printf ("Graphics error: %s\n",

grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

maxx=getmaxx();

maxy=getmaxy();

dx=maxx/4;

dy=maxy/4;

bar3d(dx,dy,maxx-dx,maxy-dy,30,6);

setwritemode (XOR_PUT);

do

{

x=random(maxx-dx);

y=random(maxy-dy);

rectangle(x,y,x+dx,y+dy);

delay(200);

rectangle(x,y,x+dx,y+dy);

} while (!kbhit());

closegraph();

return 0;

}

 

Рисунок 1.13 – Зображення виконуючого файлу для прикладу 1.14

Керування кольорами і шаблонами заливки (краски, палітра, заповнення)

Функція getcolor()повертає значення коду поточного кольору.

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

Функція setpalette( int colornum,int color) заміщує один із кольорів в палітрі (colornum- вказує номер кольору в палітрі).

Функція заливки (шаблон заповнення)

void setfillpattern(const char far *__upattern, int __color);

Функція setfillpatternвстановлює тип заливки і її колір для всіх типів заливки, які виконуються функціями fillpoly(), bar(), floodfill(), bar3d(), pieslicе().

Функція встановлює зразок і колір заливки (для функцій fillpoly(), bar(), bar3d(), pieslise()).

Всі дозволені значення зразків визначені в бібліотеці graphics.h у вигляді сталих. Ось декілька прикладів:

EMPTY_FILL=0; суцільна заливка кольором фона;

SOLID_FILL=l; суцільна заливка поточним кольором;

LINE_FILL=2; заливка лініями;

HATCH_FILL=7; заливка рідким штрихуванням;

USER_FILL=12; заливка визначена програмістом.

color колір яким виконується шаблон, колір фона при цьому залишається незмінним.

Заливка областей зображення

Існує ряд функцій, які малюють графічні фігури і одразу ж заповнюють їх по заданому шаблону:

bar(int left, int top, int right, int bottom) – малює прямокутник, внутрішня область, якого залита по поточному шаблону.

 

Лістинг 1.15. Заливка області

 

do

{

r=random(getmaxcolor());

setfillstyle(l,7);

xl=random(getmaxx());

yl=random(getmaxy());

x2=random(getmaxx() / 2);

y2=random(getmaxy() / 2);

bаr(х1,у1,х2,у2);

delay(200);

} while(!kbhit());

Функція bar3d(int left, int top, int right, int bottom, int depth, int topflag) – малює паралелепіпед лицева сторона, якого заливається по поточному шаблону, а глибина задається в пікселях параметром depth.

 

Лістинг 1.16. Заливка області

 

setfillstyle(l,7);

X1=random(getmaxx());

Y1=random(getmaxy());

X2=random(getmaxx());

Y2=random(getmaxy());

bar3d(xl,yl,x2,y2,15,True);

delay(200);

bar3d(xl,yl,x2,y2,15,False);

delay(200);

bar3d(80,100,120,180,15,True);

getch(0);

Функція fillellipse(int x, int y, int xradius, int yradius ) – малює еліпс поточним кольором і зaсповнює його по встановленому шаблону.

 

Приклад:

setfillstyle(l,11);

setcolor(7);

fillellipse(xl,yl,x2,y2);

 

Заповнення більш складних геометричних фігур, в тому числі і неправильної форми виконується функцією fillpoly(int numpoints, const int far *polypoints).

Функція floodfill(int x, int y, int border) – заливає всю область навколо точки (x, y), обмежену лініями кольору border. Наприклад якщо точка (х, у) знаходиться в середині області обмеженій колом, то вся область буде залита по шаблону і кольором , встановленим функціями setfillpattern()або setfillstyle().Якщо точка знаходиться поза цією областю, то залитим буде весь екран за винятком цієї області.

 

1.5 Ефекти мультиплікації

Функція setwritemode( int mode ) задає режим порозрядного суміщення зображень, тобто режим, в якому при накладенні 2-х точок стирається або ні нижня точка (спосіб зняття верхнього зображення з екрану).

Дві послідовно проведені логічні операції XOR_PUT приведуть біти пам'яті монітора в початковий стан. Це означає, що якщо на екрані присутнє якесь зображення, то його можна використати в якості фону, намалювати на ньому довільний малюнок, а потім відновити первинний вигляд. При ініціалізації і після зміни режимів встановлювати режим COPY_PUT.

Режим setwritemode() розповсюджується тільки на малювання відрізками, тобто функціями line(), lineto(), linerel(), rectangle(), drawpoly().

1.6 Робота з фрагментами зображення

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

imagesize(int left, int top, int_right, int bottom);

getimage(int left, int top, int right, int bottom, void far *bitmap);

putimage(int left, int top, const void far *bitmap, int op);.

Функція imagesize()дозволяє визначити об'єм прямокутного фрагменту зображений в байтах. Прямокутник визначається координатами діагоналі (х1, у1), (х2, у2). Ця функція використовується разом з функцією malloc(). Записується зображення в буфер за допомогою функціїgetimage(), в якій параметри xl, yl, x2, y2 мають теж значення що в imagesize(). Параметр bitmap– нетиповий, повинен бути більше чи дорівнювати 4+розмір пам'яті відведений для області екрану (максимальний розмір зберігаємого зображення не повинен перевищувати 64К) і є зміною-буфером (4 байта = 2 слова, які містять ширину і висоту в пікселях запам'ятовуємого зображення).

Функція putimage(). Найбільш цікавим в цій функції є можливість визначити режим виводу зображення: можна додавати зображення на екрані і зображення в буфері; можна знищити зображення, яке знаходиться в визначеній області; можна інвертувати зображення, яке міститься в буфері. Ці операції задаються параметром op, для якого визначені такі сталі:

COPY_PUT=0; операція MOV (заміщення);

XOR_PUT=l; операція XOR;

OR_PUT=2; операція OR;

AND_PUT=3; операція AND;

NOT_PUT=4; операція NOT.

 

Для формування динамічної складної картинки необхідно:

1. Вибрати розміри прямокутника, який містить динамічний об'єкт тобто визначаються координати діагоналі (XI,YI) (X2,Y2).

 

2. Визначити крок приросту (для організації руху) по осях Х і Y: SxMoveі SyMove i кінцеву точка руху (Xn, Yn) в межах використовуємого екрану.

 

3. Задати тип заливки : функція setfillstyle().

4. Вибрати фонову картинку і її заливку.

5. Задати розмір динамічної картинки
Size =imagesize(xl,yl.x2,y2).

  1. Утворити стек (буфер) в буферній пам'яті з однаковим визначенням його початкової адреси malloc(size);
  2. Завантажити фрагмент в буфер getimage(xl,yl,x2,y2,p).
  3. В циклі багатократно обраний фрагмент вивантажується з пам'яті функцією putimage() з змінними координатами руху putImage(sx, sy,p, XOR_PUT); sx=x+dx, sy=y+dy.
  4. Після закінчення малювання необхідно очистити буфер процедурою free(Size).

 

Лістинг 1.17. Робота з фрагментами зображень з використанням функцій

imagesize(), getimage(), putimagе()

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#define ARROW_SIZE 10

void draw_arrow(int x, int y);

int main(void)

{

int gdriver = DETECT, gmode, errorcode;

void *arrow;

int x, y, maxx;

unsigned int size;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{printf("Graphics error: %s\n",

grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

maxx = getmaxx();

x = 0;

y = getmaxy() / 2;

/* рисування зображення, яке буде рухатись */

draw_arrow(x, y);

/* визначення розміру зображення */

size = imagesize(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE);

/* відведення пам’яті під зображення*/

arrow = malloc(size);

/* захват зображення*/

getimage(x, y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE, arrow);

while (!kbhit())

{

/* вирізання попереднього зображення */

putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);

x += ARROW_SIZE;

if (x >= maxx)

x = 0;

/* вставка нового зображення */

putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);

}

free(arrow);

closegraph();

return 0;

}

void draw_arrow(int x, int y)

{

/* рисування стрілки на екрані */

moveto(x, y);

linerel(4*ARROW_SIZE, 0);

linerel(-2*ARROW_SIZE, -1*ARROW_SIZE);

linerel(0, 2*ARROW_SIZE);

linerel(2*ARROW_SIZE, -1*ARROW_SIZE);

}

 

Рисунок 1.14 – Зображення виконуючого файлу для прикладу 1.17

 

Лістинг 1.18. Робота з фрагментом зображення і формування динамічної картинки

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <dos.h>

 

const r=10; // радіус рухомої кулі

void GrInit ();// прототип функції ініціалізації графіки

 

void main () {

int x1,y1,x2,y2,sx,sy;// змінні для оживлення фрагменту

int maxx,maxy,sxmove,symove;

int size;// розмір фрагменту

char *p; // вказівник на буфер

GrInit();// виклик функції ініціалізації графіки

/* максимальне поле екрану */

maxx=getmaxx();

maxy=getmaxy();

/*координати області екрану, в якому намальовано кульку і яка буде збереженним фрагментом*/

x1=(maxx/2)-r;

y1=(maxy/2)-r;

x2=x1+2*r;

y2=y1+2*r;

sx=x1;

sxmove=3;// початкова точка руху

sy=y1;

symove=-1;// крок переміщення кульки

setfillstyle(1,RED);// вибір типу заливки

pieslice(x1+r,y1+r,0,360,r);// малювання кульки

size=imagesize(x1,y1,x2,y2);// розмір фрагменту в байтах

/*розміщення буферу (оператор new відводе місце в size байт в пам’яті, присвоюючи адресу його початку вказівнику p */

p=new char(size);

getimage (x1,y1,x2,y2,p); // фрагмент в буфер

setfillstyle (CLOSE_DOT_FILL,BLUE);// тип заливки фону

bar (50,50, maxx-50, maxy-50);// фонова картинка

do { // починається рух кульки

putimage (sx,sy,p,XOR_PUT);// вивід кульки

delay (10);// затримка 10 мс

putimage (sx,sy,p,XOR_PUT);// стирання кульки

/* обмеження на рух кульки в рамках поля */

if ((sx<50)||(sx>maxx-50-2*r)) sxmove=-sxmove;

if ((sy<50)||(sx>maxy-50-2*r)) symove=-symove;

/* наступна точка появи на екрані кульки, доки не натиснута клавіша */

sx+=sxmove;

sy+=symove;

} while (!kbhit());

free(p);// вивільнення пам’яті буферу

closegraph ();

}

 

void GrInit () {

int gdriver=DETECT, gmode, errorcode;

clrscr ();

initgraph(&gdriver, &gmode,"");

errorcode=graphresult();

if (errorcode!=grOk) {

printf ("Graphics error: %s\n", grapherrormsg(errorcode));

printf ("Press any key to halt...");

getch ();

exit (1);

}

}

 

Рисунок 1.15 – Зображення виконуючого файлу для прикладу 1.18

 

1.7 Керування відео сторінками

1. Функція setvisualpage (int page),яка встановлює видимою на екрані відео сторінку номер page.

2. Функція setactivepage(int page), встановлює перенаправлення всіх графічних операцій на сторінку номер page.

Лістинг 1.19. Керування відео сторінками (тільки для адаптерів VGA і EGA)

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

int main()

{ /* вибір драйверу і режиму */

int gdriver = EGA, gmode = EGAHI, errorcode;

int x, y, ht;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();

if (errorcode != grOk)

{ printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

x = getmaxx() / 2;

y = getmaxy() / 2;

ht = textheight("W");

/* вибір невидимої сторінки для рисування*/

setactivepage(1);

/* рисування лінії на сторінці #1 */

line(0, 0, getmaxx(), getmaxy());

/* виведення повідомлення на сторінці #1 */

settextjustify(CENTER_TEXT, CENTER_TEXT);

outtextxy(x, y, "This is page #1:");

outtextxy(x, y+ht, "Press any key to halt:");

/* вибір рисунка для сторінки #0 */

setactivepage(0);

/* виведення повідомлення на сторінці #0 */

outtextxy(x, y, "This is page #0.");

outtextxy(x, y+ht, "Press any key to view page #1:");

getch();

/* вибір сторінки #1 як видимої */

setvisualpage(1);

getch();

closegraph();

return 0;

}

1.8 Вибір шрифту і стиля

В бібліотеці graphics.h є набір шрифтів, які можуть бути використані для виводу інформації:

DEFAULT_FONT= 0 TRIPLEX_FONT= 1

SMALL_FONT= 2 SANS_SERIF_FONT= 3

GOTHIC_FONT= 4 SCRIPT_FONT= 5

SIMPLEX_FONT= 6 TRIPLEX_SCR_FONT= 7

COMPLEX_FONT= 8 EUROPEAN_FONT = 9

BOLD_FONT= 10

Щоб обрати потрібний шрифт, потрібно використати функцію settextstyle(int font, int direction, int charsize).

Параметр font номер шрифту; direction – розташування тексту. Можливі лише дві орієнтації тексту; відзначені такими константами:

HORIZ_DIR = 0;

VERT_DIR = 1;

Charsize – розмір кожного символу.

Для виводу тексту використовують дві функції:

outtext(const char far *textstring); – виводить на графічний екран стрічку textstring, орієнтовано відносно позиції поточного вказівника;

outtextxy(int x, int y, const char far *textstring); – виводить стрічку орієнтовано відносно координат х, у.

Шрифт попередньо може бути встановлений викликом функції settextstyle().

Розмір букв та стрічок

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

Функції

textheight(const char far *textstring);

textwidth(const char far *textstring);

повертають ширину та довжину стрічки textstring в пікселях.

 

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

1.Яка бібліотека функції призначена для керування графічними режимами?

2. Які файли мають бути у робочому каталозі для роботи у графічному режимі?

3. Охарактеризуйте функціональні групи бібліотеки graphics.h?

4. Яким чином відбувається ініціалізація графічного режиму?

5. Які ви знаєте процедури для малювання графічних примітивів?

6. Для чого призначена функція drawpoly(), які її параметри?

7. Який діапазон кольорів BGI драйверів?

8. Як здійснити перехід від графічного режиму до текстового?

9. Які способи заливки зображення ви знаєте?

10. Що ви знаєте про логічні операції XOR_PUT і COPY_PUT?

11. Які функції використовуються для роботи з фрагментами зображення?

12. Дайте коротку характеристику функціям керування відео сторінками?

13. В якій бібліотеці міститься набір шрифтів для виводу інформації?

14. Які функції використовуються для виведення тексту?

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

 

1.10 Практикум з програмування

1. Напишіть функцію ініціалізації графічного режиму з врахуванням обробки помилок ініціалізації.

2. Напишіть функцію для переходу з графічного режиму в текстовий.

3. Напишіть функцію для малювання кола з заданими координатами.

4. Використовуючи генератор випадкових чисел, напишіть програму малювання прямокутників з різною товщиною ліній.

5. Напишіть програму для малювання дуг різними кольорами.

6. Напишіть функцію для малювання заповненого прямокутника заданого розміру.

7. Напишіть функцію для малювання паралелепіпеда, заповненого заданим кольором.

8. Напишіть функцію для малювання різнокольорових заповнених еліпсів.

9. Напишіть програму для малювання рухомого місяця вздовж лінії горизонту нічного неба.

10. Наведіть приклад заливки області.


2 ПРИНЦИПИ РОЗРОБКИ ГРАФІЧНИХ ЗАСТАВОК В ПРОФЕСІЙНИХ ПРОГРАМАХ

 

2.1 Загальні відомості

Робота в графічному режимі виконується за допомогою попередньо визначених констант, типів та функцій стандартної бібліотеки graphics.h. Для того щоб отримати складний малюнок необхідно представити його у вигляді сукупності найпростіших геометричних елементів.

Розглянемо програмування конкретного малюнку зображеного на рисунку 2.1.

Рисунок 2.1 – Приклад графічної заставки

 

Щоб спростити цю задачу розіб’ємо малюнок на дві основи: напис слова “Musyanya” та зображення дівчинки. Ці основи розпадаються на більш прості об’єкти. Наприклад напис складається з кожної окремо намальованої літери, а зображення дівчинки з основних складових людського тіла, такі як голова, тулуб та ноги. Кожен з цих простих об’єктів можна представляти як сукупність ще простіших складових, до тих пір поки вони не представлятимуть собою сукупністю найпростіших геометричних фігур, вивід на екран яких вже запрограмований в стандартній бібліотеці.

 

2.2 Особливості розробки статичної частини графічної заставки

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

Почнемо з функції, яка малює літеру “М”. Ця задача складається з виводу на екран таких найпростіших елементів як лінія (1, 2), еліпс (3, 4), дуга (5, 6, 7, 8).

void S_M(int x1,int y1)

{

setcolor(8);

setfillstyle(1,8);

setlinestyle(0,1,3);

line(x1,y1,x1,y1-80); //Вивід лінії 1

fillellipse(x1-7,y1,7,5); //Вивід еліпса 3

line(x1+25,y1,x1+25,y1-60); //Вивід лінії 2

fillellipse(x1+18,y1,7,5); // Вивід еліпса 4

arc(x1,y1-45,313,0,25); //Вивід дуги 5

arc(x1-26,y1-25,360,50,40); //Вивід дуги 6

arc(x1+26,y1-75,180,230,25); //Вивід дуги 7

arc(x1-10,y1-40,340,50,25); //Вивід дуги 8

setfillstyle(1,8);

setfillstyle(1,8);

floodfill(x1+2,y1-59,8);

}

Рисунок 2.2 – Малювання літери “М”

За таким же принципом на екран виводяться всі інші літери: “U”, “S”, “Y”, “A”, “N”.

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

Контур обличчя представляє собою еліпс, центром якого є точка з координатами (170, 120), горизонтальний радіус 60, а вертикальний 30 точок.

setcolor(8);

setfillstyle(1,14);

setlinestyle(0,1,1);

fillellipse(170,120,60,30); //малює закрашений еліпс – голова

 

Рисунок 2.3 – Малювання голови

 

Навушники це два еліпси між якими дві дуги, а простір між дугами залитий темно-сірим кольором. Код завдяки якому малюються навушники є таким:

setcolor(8);

setfillstyle(1,8);

setlinestyle(0,1,1);

fillellipse(110,120,10,20); //малює еліпс – лівий навушник

fillellipse(230,120,10,20); //малює еліпс – правий навушник

arc(170,165,40,140,85);

arc(170,170,40,140,85); //малює дуги з’єднання двох навушників

floodfill(170,82,8);//закрашує відокремлену дугами область

 

 

 

Рисунок 2.4 – Малювання навушників

 

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

setfillstyle(1,15);

fillellipse(160,90,10,15);

//малює закрашений білий еліпс – ліве око

fillellipse(180,90,10,15);

//малює закрашений білий еліпс – праве око

setfillstyle(1,1);

fillellipse(165,95,4,6); );

//малює закрашений синій еліпс – ліве око

fillellipse(185,95,4,6); );

//малює закрашений синій еліпс – праве око

Рот мабуть найпростіший об’єкт обличчя, тому що це проста дуга кола, від початкового кута 220 до кінцевого кута 320 градусів з радіусом 60 точок. Точка з координатами (170, 75) використовується, як центр кола.

setcolor(8);

setlinestyle(0,1,3);

arc(170,75,220,320,60); //малює дугу - рот

//Волосся на голові у дівчини виконано також за допомогою дуг.

setlinestyle(0,1,1);

arc(260,105,120,170,60);

arc(260,105,120,170,50);

arc(260,105,120,170,40);

arc(80,105,10,60,60);

arc(80,105,10,60,50);

arc(80,105,10,60,40); //дуги – волосся

Голова вже майже намальована, не вистачає брів, але оскільки це рухома частина, то детальніше їх зображення буде описане нижче.

Розглянемо тулуб, який можна представити як сукупність деталей: контур тулубу, шия, руки, майка, юбка та плеєр. Як і контур голови контур тулубу являє собою простий еліпс, який з’єднує з головою шия. Шия представлена як маленький прямокутник. Юбка теж зображена досить символічно, у вигляді прямокутника, але вже більшого. Для виводу на екран закрашених прямокутників використовується функція bar3d(), де параметр глибини паралелепіпеду приймає значення 0. Нижче наведений код для виводу на екран контуру тулуба, шиї та юбки.

setcolor(8);

setfillstyle(1,14);

setlinestyle(0,1,1);

fillellipse(170,205,35,50); //малює еліпс – тулуб

bar3d(165,150,175,155,0,1);//малює паралелепіпед – шия

setlinestyle(0,1,1);

setfillstyle(1,1);

bar3d(140,230,200,260,0,1); ); //малює паралелепіпед – юбка

 

 

Рисунок 2.5 – Малювання тулуба та спідниці

 

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

arc(140,160,270,5,20);

arc(200,160,173,275,20);

line(135,200,205,200); //малює 2 дуги та лінію – контури майки

setfillstyle(1,12);

floodfill(145,190,8);//закрашує відокремлену дугами область – майка(3)

Музичний CD-плеєр – це просто закрашений еліпс з однаковими радіусами, що по суті є колом. А напис на плеєрі зроблено з використанням функції outtextxy(). Отже, все це можна представити у вигляді:

setcolor(8);

setfillstyle(1,7);

setlinestyle(0,1,1);

fillellipse(170,215,20,20); //малює закрашений еліпс – музичний

//CD-плеєр

setcolor(BLACK);

outtextxy(155,205,"SONY");

//виводить стрічку тексту – напис на плеєрі

outtextxy(160,225,"MP3");

// руки представлені як великі дуги, а пальці як маленькі лінії.

setlinestyle(0,1,3);

arc(170,190,280,50,30);

arc(170,190,140,260,30); //дуги – руки

setcolor(8);

line(160,227,165,220);line(167,228,165,220);line(172,225,165,220);

line(165,216,175,220);line(175,210,175,220);line(170,213,175,220); //лінії – пальці

// ноги можна представити як закрашені сектори кола з малим кутом.

setfillstyle(1,14);

pieslice(155,340,83,90,80);

pieslice(195,340,101,95,81); //виводить на екран закрашені сектори // кола – ноги (4)

// нерухома ступня є закрашена область, яка обмежена лінією та дугою.

line(155,340,125,340);

arc(140,360,52,120,25);

setfillstyle(1,8);

floodfill(145,339,8); //закрашується область, яка обмежена лінією

//та дугою – нерухома ступня (5)

2.3 Особливості розробки динамічної частини графічної заставки

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

line(20,5,20,25);//виводить лінію (частина ноти)

//виводить закраш


<== попередня лекція | наступна лекція ==>
Графикамен орындалатын операциялар | Функція аналогічна до strchr(), strcmp(), strcoll(), stricmp(), strncmp(), strnicmp()


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