
- •§ 2. Типи даних
- •§ 3. Присвоєння
- •§ 5. Потоки. Введення - виведення даних
- •§ 6. Адреси даних. Вказівники. Динамічна пам'ять
- •§ 7. Файли
- •§ 8. Розгалуження
- •§ 9. Цикли
- •§ 10. Функції (1)
- •§ 11. Функції (2)
- •§ 12. Масиви
- •§ 13. Рядки
- •§ 14. Структури, списки, стеки, черги, об'єднання
- •§ 15. Графіка
- •§ 16. Вступ до об'єктно-орієнтованого програмування
- •§ 1. Вступ до візуального програмування
- •§ 2. Задача про анкету
- •§ 3. Задача про обмін валюти
- •§ 4. Задача табулювання функції
- •§ 5. Створення навчальної програми
§ 15. Графіка
1. Графічний режим. Розглянемо, як виконувати графічні побудови у середовищах C++ для операційної системи DOS, зокрема, у середовищі компілятора Turbo C++ 3.0.
Графічний екран дисплея складається з точок, які можна засвічувати певним кольором чи гасити, у результаті чого на екрані утворюється деяке зображення. Точки називаються пікселями. Кількість точок на екрані може бути різною. Це залежить від характеристик і налаштування монітора. Розглянемо екран, який має 640 точок у горизонтальному (х) напрямку і 480 у вертикальному (у). Відлік точок ведуть з лівого верхнього кута екрана. Кожна точка характеризується двома координатами (х, у). Приклади розташування деяких точок на екрані показані на рис. 2.
Визначити кількість точок уздовж осей 0Х та 0Y можна відповідно за допомогою команд getmaxx () і getmaxy ().
Програми, що виконують графічні побудови, переважно є лінійними і складаються з викликів стандартних графічних функцій, які описані у бібліотечному файлі graphics.h.
Для того, щоб створити зображення, спочатку треба задати графічний режим. Це виконують так:
// Для опису характеристик дисплея
int gdriver = DETECT, gmode, errorcode;
// Задання графічного режиму
initgraph(&gdriver, &gmode,""); errorcode = graphresult();
if (errorcode != grOk)
{
cout << " графічний режим задати не вдалосяЛп";
cout << "Помилка: " << grapherrormsg(errorcode);
cout<< "\п Для виходу натисніть на будь-яку клавішу";
getch();
exit(1);
}
2. Функції для графічних побудов. Розглянемо функції бібліотеки graphics.h, які використовуються як команди.
initgraph(<драйвер>, <режим>, <шлях до драйвера>) - задає графічний режим. Шлях до драйвера зазначають у лапках;
detectgraph(<ApaiiBep>, <режим>) - повертає значення характеристик дисплея;
setcolor(<Konip>) - задає колір майбутнього зображення;
setbkcolor(<Konip>) - задає колір тла;
putpixel(x, у, <колір>) - висвітлює точку (х,у) заданим кольором;
lіnе(х1, у1, х2, у2) - рисує лінію між двома точками;
lineto(x, у) - рисує лінію від поточної точки до точки (х, у);
linerel(dx, dy) - рисує лінію від поточної точки із заданими приростами;
bаг(х1, у1, х2, у2) - рисує зафарбований прямокутник;
bar3d(x1, y1, х2, у2, <об'ємна глибина>, п) - рисує паралелепіпед;
rectangle(x1, yi, х2, у2) - рисує прямокутник із заданими координатами діагонально протилежних вершин (лівої верхньої та правої нижньої);
setviewport(x1, у1, х2, у2, n) - задає координати нового графічного вікна. Цілочисельна змінна n задає режим відсікання зображення, яке виходитиме за межі вікна;
сіrсlе(х, у, R) - рисує коло з радіусом R і центром у точці (х, у);
агс(х, у, початковий кут>, <<кінцевий кут>, <радіус>) - рисує дугу;
pieslice(x, у, <<початковий кут>, <<кінцевий кут>, <радіус>) - рисує зафарбований сектор;
ellipse(x, у, <<початковий кут>, <<кінцевий кут>, <<горизонт, радіуо, <<вертик. радіус>) –
рисує еліпс чи дугу еліпса;
setfillstyle(<заповнення>, <колір>) - задає спосіб заповнення замкнутої області залежно від значення параметра заповнення: 0 - заповнення кольором фону, 1 - суцільне заповнення, 2 - заповнення товстими горизонтальними лініями, 3 - заповнення нахиленими лініями,…, 10 - заповнення точками,11- щільне заповнення точками;
floodfill (x, у, <<колір межі>) - заповнює замкнену область, що містить точку (x,y);
closegraph() закриває графічний режим;
outtext(<Tекст>) виводить заданий текст із поточної позиції;
outtextxy(x, у, <текст>) - виводить текст у заданому місці;
settextstyle(<ujp^T>, <напрям>, <розмір>) - задає вигляд символів, напрямок виведення: 0 - горизонтально чи 1 - вертикально, а також розміри символів 1, 2, З
Розглянемо деякі функції, які використовуються у виразах.
graphresult() - повертає код помилки, якщо неможливо задати графічний режим; 0-у разі задання;
getmaxx() - повертає значення розміру екрана вздовж осі ОХ;
getmaxy() - повертає значення розміру екрана вздовж осі 0Y;
getcolor() - повертає значення поточного кольору;
getx(), gety() - повертають координати поточного пікселя
3. Кольори. Кольори задають числами або англійськими назвами:
BLACK = 0 - чорний; DARKGRAY = 8 - темно-сірий;
BLUE = 1 - синій; LIGHTBLUE = 9 - яскраво-синій
GREEN = 2-зелений; LIGHTGREEN = 10-яскраво-зелений;
CYAN = 3 - блакитний; LIGHTCYAN = 11- яскраво-блакитний;
RED = 4 - червоний; LIGHTRED = 12 - яскраво-червоний;
MAGENTA = 5 - фіолетовий; LIGHTMAGENTA = 13 - яскраво-фіолетовий;
BROW = 6-коричневий; YELLOW = 14-жовтий;
LIGHTGRAY = 7 - світло-сірий; WHITE = 15 - білий.
Задача 1 (про концентричні кола). Нарисувати різними кольорами десять концентричних кіл, які мають спільний центр посередині екрана (в точці з графічними координатами (320; 240)), і описати навколо кіл червоний прямокутник.
#include <stdlib.h> // Кола
#include <iosiream.h>
#include <conio.h>
#include <graphics.h>
int main()
{
int gdriver = DETECT, gmode, errorcode;
intx, y, radius = 10;
initgraph(&gdriver, &gmode,""); errorcode = graphresult();
if (errorcode != grOk)
{
cout << "Помилка:" << grapherrormsg(errorcode);
cout<< "\n Натисніть на будь-яку клавішу";
getch();
exit(1);
}
x = getmaxx() /2; у = getmaxy() / 2;
while (radius <= 100)
{
setcolor(radius /10);
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(0);
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(0);
circle(200, 100, 100);
settextstyle(0, 0, 3);
outtextxy(140, 95, "Львів");
getch();
closegraph();
return 0;
}
Задача З (про графік функції). Нарисувати графік функції у = 2sin2x 4- 1 на проміжку [0; 2тс], табулюючи функцію з кроком h = 0,1. У результаті експериментів, змінюючи значення амплітуди в пікселях (за допомогою множника М), зобразити графік на екрані якнайкраще.
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
float f(float x);
void main()
{
const float a = 0, b = 2 * 3.14, h = 0.1;
const int hi = 5, xO = 60, yO = 240, M = 50;
int gdriver = DETECT, gmode, errorcode;
int xi, yi; float x, y;
initgraph(&gdriver, &gmode,"");
errorcode = graphresult();
if (errorcode !=grOk)
{
cout << "Помилка " << grapherrormsg(errorcode);
cout << "\n Натисніть на будь-яку клавішу";
getch();
exit(1);
}
setbkcolor(1);
setcolor(i4);
line(20. y0. 600, y0);
line(x0, 440, x0, 20);
x = a,
x1 = x0 + M * x;
y = f(x);
y1 = y0 - M * y;
moveto(x1, y1);
setcolor(15);
do {
у = f(x); y1 = yO - (M * y);
lineto(x1, y1);
x1 += h1; x=x+h; }
while (x <= b);
settextstyle( 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; }
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 = graphresult();
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);
y += sy;
if (y < 60 | | у > getmaxy() - 60)
sy = -sy;
}
while(!kbhit()); // Доки не натиснута будь-яка клавіша
getch();
closegraph();}
Функція delay(n), яка описана у бібліотеціi dos.h, призначена для затримки на екрані результатів виконання програми на п мікросекунд.
Функції kbhit() повертає значення хибність (або 0), якщо натиснута будь-яка клавіша на клавіатурі, або істина (довільне ціле число) у протилежному випадку. Вона описана у бібліотеці conio.h.
Вправи
Намалюйте в центрі екрана правильну чотирикутну піраміду.
Зобразіть рух сонця на блакитному небі.
Розв'яжіть задачі № 21, 22, 23 вашого варіанта з розділу "Задачі".