Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глинський С++.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.26 Mб
Скачать

Тема 15. Графіка

  1. Графічний режим. Розглянемо, як виконувати графічні побудови у середовищах C++ для операційної системи DOS, зокрема, у середовищі компілятора Turbo C++ 3.0.

http://kaf401.rloc.ru/Informatics/localdevcpp.html

Написание простых графических программ

Для того, чтобы подключить модуль для работы с графикой, сделайте следуюшее:

  1. Скачайте архив, содержащий файлы graphics.h (заголовочный файл) и libbgi.a (библиотека). Размер архива 53 Кб.

  2. Скопируйте файл graphics.h в папку C:\Dev-Cpp\include.

(C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include і при установке дева это указать или подключить editor options\code completion)

C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib32

  1. Скопируйте файл libbgi.h в папку C:\Dev-Cpp\lib.

  2. Запустите оболочку Dev-C++ и войдите в меню Сервис-Параметры компилятора.

  3. Перейдите на вкладку Компилятор, включите флажок Добавить эти команды к командной строке компоновщика и добавьте в окно под этим флажком строчку

-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

как на рисунке:

После выполнения этих действий вы можете использовать команды для рисования графических примитивов (отрезков, прямоугольников, окружностей и т.д.), так же, как раньше в Turbo C и Borland C++. Полное описание команд (на английском языке) можно найти на странице Михаэля Майна.

Вот так выглядит простейшая программа, которая выводит на экран отрезок из точки (0,0) (это левый верхний угол окна) в точку (50,50) и ждет нажатия на любую клавишу:

#include <graphics.h>

int main()

{

initwindow(400,300); // открыть окно для графики

// размером 400 на 300 пикселей

moveto(0,0); // курсор в точку (0,0)

lineto(50,50); // отрезок в точку (50,50)

getch(); // ждать нажатия на любую клавишу

closegraph(); // закрыть окно с графикой

return 0;

}

 

В программах, которые не работают с графикой, флажок Добавить эти команды к командной строке компоновщика нужно отключать, иначе при завершении программы будет появляться сообщение об ошибке.

Http://www.Rsdn.Ru/article/opengl/ogltut2.Xml Графическая библиотека OpenGl

http://valera.asf.ru/cpp/scpp/cppd_graphics.h.htm

С Windows в отличии от DOS и так работает в графическом режиме. Для работы с графикой используйте специальные библиотеки OpenGL DirectX etc...

Графічний екран дисплея складається з точок, які можна посвічувати певним кольором чи гасити, у результаті чого на екрані утворюється деяке зображення. Точки називаються пікселями. Кількість точок на екрані може бути різною. Це належить від характеристик і налаштування монітора. Роз­глянемо екран, який має 640 точок у горизонтальному (х) на­прямку і 480 у вертикальному (у). Відлік точок ведуть з ліво­го верхнього кута екрана. Кожна точка характеризується дво­ма координатами (х, у). Приклади розташування деяких то­чок на екрані показані на рис. 2.

Визначити кількість точок уздовж осей 0Х та 0Y можна відповідно за допомогою команд getmaxx ( ) і getmaxy ( ).

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

Рис. 2. Координати точок на графічному екрані 640x480

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

// Для опису характеристик дисплея

int gdriver = DETECT, gmode, errorcode;

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

initgraph(&gdriver, &gmode, errorcode = graphresult();

if (errorcode != grOk)

{

cout << " графічний режим задати не вдалося\n";

cout << "Помилка:" << grapherrormsg(errorcode);

cout << "\n Для виходу натисніть на будь-яку клавішу";

getch();

exit(1);

}

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

іпіІдгарГі(<драйвер>, <режим>, <шлях до драйвера») - задає графічний режим. Шлях до драйвера зазначають у лапках; detectgгaph(<дpaйвep>, <режим>) - повертає значення характеристик дисплея;

зе1соіог(<колір>) - задає колір майбутнього зображення;

8еІЬксоІог(<колір>) - задає колір тла;

рігіріхеі(х, у, <колір>) - висвітлює точку (х,у) заданим кольором;

Ііпе(х1, у1, х2, у2) - рисує лінію між двома точками;

ІіпеК)(х, у) - рисує лінію від поточної точки до точки (х, у);

ІіпегеІ^х, йу) - рисує лінію від поточної точки із заданими приростами;

Ьаг(х1, у1, х2, у2) - рисує зафарбований прямокутник;

ЬагЗй(х1, уі, х2, у2, <об'ємна глибина>, n) - рисує паралелепіпед; гесіапдіе(х1, у1, х2, у2) - рисує прямокутник із заданими координатами діагонально протилежних вершин (лівої верхньої та правої нижньої);

8еМе\лфоП(х1, уі, х2, у2, n) - задає координати нового графічного вікна. Цілочисельна змінна n задає режим відсікання зображення, яке виходитиме за межі вікна; сігсІе(х, у, И) - рисує коло з радіусом (Ч і центром у точці (х, у); агс(х, у, «початковий кут>, <кінцевий кут>, <радіус>) - рисує дугу; ріевІісе(х, у, «початковий кут>, «кінцевий кут>, <радіус>) - рисує зафарбований сектор; еІІірве(х, у, «початковий кут>, «кінцевий кут>, «горизонт, радіуо, «вертик. радіус>) - рисує еліпс чи дугу еліпса; 5еІГіІІзІуІе(«заповнення>, <колір>) - задає спосіб заповнення замкнутої області залежно від значення параметра заповнення: 0 -

заповнення кольором фону, 1 - суцільне заповнення, 2 - заповнення товстими горизонтальними лініями, 3 - заповнення нахиленими

лініями 10 - заповнення точками,11- щільне заповнення

точками;

НоосШІІ (х, у, «колір межі>) - заповнює замкнену область, що містить точку

(х.у);

сІоєедгарИО - закриває графічний режим; оийех1(«текст>) - виводить заданий текст із поточної позиції; оиНехІху(х, у, <текст>) - виводить текст у заданому місці; 5ейехІ8Іуіе(«шрифт>, <напрям>, «розмір») - задає вигляд символів, напрямок виведення: 0 - горизонтально чи 1 - вертикально, а також розміри символів 1,2,3

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

graphresult()

- повертає код помилки, якщо неможливо задати графічний

режим; 0-у разі задання;

getmaxx()

- повертає значення розміру екрана вздовж осі 0Х;

getmaxy()

- повертає значення розміру екрана вздовж осі 0У;

getcoior()

- повертає значення поточного кольору;

getxQ, getyO

- повертають координати поточного пікселя

  1. К

    DARKGRAY = 8 - темно-сірий;

    LIGHTBLUE = 9 - яскраво-синій LIGHTGREEN = 10 - яскраво-зелений; LIGHTCYAN = 11- яскраво-блакитний; LIGHTRED = 12 - яскраво-червоний; LIGHTMAGENTA = 13 - яскраво-фіолетовий; YELLOW = 14-жовтий;

    WHITE = 15-білий.

    ольори. Кольори задають числами або англійськими назвами:

BLACK = 0 - чорний;

BLUE = 1 - синій;

GREEN = 2 - зелений;

CYAN = 3 - блакитний;

RED = 4 - червоний;

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

BROW = 6 - коричневий;

LIGHTGRAY = 7 - світло-сірий;

Задача 1 (про концентричні кола). Нарисувати різними кольорами десять концентричних кіл, які мають спільний центр посередині екрана (в точці з графічними координатами (320; 240)), і описати навколо кіл червоний прямокутник.

«include <stdlib.h> // Кола

«include <iostream.h>

«include <conio.h>

«include «graphics.h> int main()

{

int gdriver = DETECT, gmode, errorcode; intx, y, radius = 10;

initgraph{&gdriver, &gmode,""); errorcode = graphresultQ; if (errorcode != grOk)

{

cout « "Помилка:" « grapherrormsg(errorcode); cout « "\n Натисніть на будь-яку клавішу"; getch(); exit(1);

}

x = getmaxx() /2; у = getmaxy() / 2; while (radius <= 100)

{

setcolor(radius / 10); circle(x, y, radius); radius +=11;

}

setcolor(RED);

rectangle(220,140, 420, 340);

getch();

closegraph();

return 0;

Задача 2 (про емблему). Нарисувати емблему. У верхній лівій частині графічного екрана на чорному фоні нарисувати блакитний квадрат, а в ньому - чорне коло, зафарбоване жовтим кольором. У центрі емблеми чорними літерами написати сло­во “Львів”.

«include <stdlib.h> «include <iostream.h> «include <conio.h> «include «graphics.h> int main()

{

int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, “"); errorcode = graphresult(); if (errorcode != grOk)

{

cout« "Помилка:" « grapherrormsg(errorcode); cout « "\n Натисніть на будь-яку клавішу";

// Емблема

getch();

exit(1);

}

setbkcolor(O);

setcolor(3);

rectangle(100, 0, 300, 200);

setfillstyle(1, 3);

floodfill(200, 100, 3);

setcolor(14);

circle(200, 100, 100);

setfillstyle(1, 14);

floodfill(200, 100, 14);

setcolor(O);

circle(200, 100, 100);

settextstyle(0, 0, 3);

outtextxy(140, 95, "Львів");

getch();

closegraph();

return 0;

}

Задача 3 (про графік функції). Нарисувати графік функції у = 2sin2x + 1 на проміжку [0; 2л], табулюючи функ­цію з кроком h = 0,1. У результаті експериментів, змінюючи значення амплітуди в пікселях (за допомогою множника М), нобразити графік на екрані якнайкраще.

«include <stdlib.h> // roacpix

«include <iostream.h>

«include <math.h>

«include <conio.h>

«include <graphics.h> float f(float x); void mainQ

const float a = 0, b = 2 * 3.14, h = 0.1; const int hi = 5, xO = 60, yO = 240, M = 50; int gdrivar = DETECT, gmode, errorcode; int x1, y1; float x, y;

initgraph(&gdriver, &gmode,""); errorcode = graphresult(); if (errorcode != grOk)

{

cout« "Помилка " « grapherrormsg(errorcode); cout« "\n Натисніть на будь-яку клавішу"; getch(); exit(1);

)

setbkcolor(l); setcolor(14); line(20, yO, 600, yO);

Iine(x0, 440, xO, 20); x = a;

x1 = xO + M * x;

y = f(x);

y1 = yO - M * y; moveto(x1, y1); setcolor(15); do

I

{,

У т f(x): y1 = yO - (M * y); lineto(x1, y1); x1 += hi; x=x+h;

)

while (x <= b); settextstylef 0, 0, 1); outtextxy(60, 245, ”0"); outtextxy(360, 245, "6.3"); settextstyle( 0, 0, 2);

outtextxy(100, 380, "Графік функції y=2sin2x+1"); getch(); closegraph();

}

float f(float x)

{

float func;

func = 2 * sin (2 * x) + 1; return func;

}

  1. Імітація руху об’єкта на екрані. Для імітації руху зоб раження об’єкта на екрані необхідно виконати такий алго ритм:

  1. Нарисувати об’єкт у заданфй точці.

  2. Витерти об’єкт, зарисувавши його кольором тла.

  3. Змінити координати об’єкта.

  4. Перейти до пункту 1.

Задача 4 (про динамічний ефект). Зобразити на чорному тлі екрана рух зеленого кола вверх-вниз.

«include <stdlib.h> //Ефект руху

«include <iostream.h>

«include <conio.h>

«include «graphics.h>

«include <dos.h> void main()

{

int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "*); errorcode = graphresultQ; if (errorcode != grOk)

{

cout « "Помилка" « grapherrormsg(errorcode); cout « “\n Натисніть на будь-яку клавішу"; getch(); exit(1);

}

setbkcolor(BLACK); setcolor(GREEN); int у = 60, sy = 4, r = 50; int x = getmaxx() / 2; do

{

circle (x, y, r); delay(30); setcolor(BLACK); circle (x, y, r); setcolor(GREEN);

У += sy;

if (y < 60 II у > getmaxyO - 60) sy = -sy;

}

while(!kbhit()); // Доки не натиснута будь-яка клавіша getch(); closegraphQ;

}

Функція delay(n), яка описана у бібліотеціі dos.h, призна­чена для затримки на екрані результатів виконання програми на n мікросекунд.

Функції kbhit() повертає значення хибність (або 0), якщо натиснута будь-яка клавіша на клавіатурі, або істина (дові ньне ціле число) у протилежному випадку. Вона описана у Гіібліотеці conio.h.

Вправи

  1. Намалюйте в центрі екрана правильну чотирикутну піраміду.

  2. Зобразіть рух сонця на блакитному небі.

  3. Розв’яжіть задачі № 21, 22, 23 вашого варіанта з розділу "Задачі".

http://habrahabr.ru/post/172091/

90 рекомендаций по стилю написания программ на C++