Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
glinskiymetodichka-s.doc
Скачиваний:
23
Добавлен:
15.08.2019
Размер:
2.7 Mб
Скачать

§ 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 <stdlib.h> // Графік

#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. Нарисувати об'єкт у заданфй точці.

  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 = 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.

Вправи

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

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

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

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