Комп’ютерний практикум № 17

ГРАФІЧНИЙ РЕЖИМ ЕКРАНУ НА МОВІ “CI”

Мета практикуму – вивчення методів роботи у графічному режимі екрана та побудова графіків функцій на мові “СІ”.

1. ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ

1.1 Стандартні функції мови “СІ” для роботи у графічному режимі знаходяться у бібліотечному файлі graphics.h, який необхідно під’єднати на початку програми за допомогою директиви #include

#include <graphics.h>

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

initgraph(int *driver, int *mode, char *path);

Аргумент driver визначає тип графіного драйвера. В більшості випадків доцільно застососовути його автоматичне визначення, задавши як константу detect (0).

Використовуваний графічними функціями відеорежим (роздільна здатність та кількість кольорів) задається у вигляді числа, на яке вказує параметр mode. У лабораторній роботі рекомендується приймати mode=0. Path визначає шлях до відеодрайвера (до каталога bgi).

Для виходу з графічного режиму використовують функції closegraph() або restorecrtmode().

Розглянемо деякі графічні функції.

arc(int x, int y, int start, int end, int radius) будує дугу кола навколо центру в точці (x,y) радіусом radius від кута start до кута end, які задаються в градусах.

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

rectangle (int left, int top, int right, in bottom) - рисує прямокутник.

bar3d(int left, int top, int right, int bottom, int depth, int topflag) - рисує паралелепіпед, який обводиться по контуру поточним кольором. Перші чотири параметри такі ж як і для функції bar. Параметр depth визначає товщину паралелепіпеда. Параметр topflag – наявність верхньої грані (1) або її відсутність (0).

circle(int x, int y, int radius) - рисує коло з центром в точці (x,y) радіусом radius.

cleardevice() - очищає екран і встановлює курсор в точку (0,0).

clearviewport() - очищує поточну область перегляду і встановлює курсор в точку (0,0) області).

drawpoly(int numpoints, int *points) - рисує багатокутник з кількістю вершин, рівною numpoints. *points – масив координат вершин.

fillpoly(int numpoints, int *points) - рисує багатокутник і зарисовує його поточним кольором заповнення зразка.

line(int x1, int y1, int x2, int y2) - з’єднує точки (x1,y1), (x2,y2) відрізком.

lineto(int x, int y) - рисує відрізок від поточної точки до точки (x,y).

linerel(int deltax, int deltay) - рисує відрізок від поточної точки до точки, зміщеної по х на deltax і по y на deltay.

moveto(int x, int y) - робить поточною точку (x,y).

outtext(char *str) - виводить на екран текстовий рядок.

outtextxy(int x, int y, char *str) - виводить на екран текстовий рядок str, координати початку рядка (x,y).

getbkcolor() - повертає поточний колір фону.

getcolor()- повертає поточний колір рисування.

getmaxcolor() - повертає найбільше допустиме значення кольору для поточного відеорежиму.

getmaxx() - повертає максимально-можливе значення x.

getmaxy() - повертає максимально-можливе значення y.

getx() - повертає поточне значення x.

gety() - повертає поточне значення y.

ellipse(int x, int y, int start, int end, int xr, int yr)- рисує сектор еліпса з центром у точці (x,y), з радіусами по осях xr, yr. Сектор визначається кутами start та end в градусах.

fillellipse(int x, int y, int xr, int yr) - рисує повний еліпс з використанням поточного кольору рисування і зарисовує еліпс поточним кольором зразку заповнення.

floodfill(int x, int y, int border) - заповнює замкнений об’єкт поточним кольором і зразком заповнення. (x,y)- координати точки всередині об’єкта. Параметр border задає колір границі.

putpixel(int x, int y, int color) - рисує точку (x,y) кольором color.

setbkcolor(int color) - змінює колір фону на колір color.

setcolor(int color) - встановлює поточний колір рисування. Колір задається цілими числами 0, 1, 2, 3, ...,15 або відповідними константами:

BLACK=0

BLUE=1

GREEN=2

CYAN=3

RED=4

MAGENTA=5

BROWN=6

LIGHTGRAY=7

DARKGRAY=8

LIGHTBLUE=9

LIGHTGREEN=10

LIGHTCYAN=11

LIGHTRED=12

LIGHTMAGENTA=13

YELLOW=14

WHITE=15

setfillstyle(int pattern, int color) - встановлює стиль pattern і колір color заливки. Параметр pattern може приймати значення від 0 до 12 (0- кольором фону, 1- суцільна, 2- лініями, 3- тонкими побічними діагоналями, 4- побічними діагоналями, 5- головними діагоналями, ...).

setlinestyle(int style, unsigned pattern, int width) - задає стиль і товщину лінії.

Можливі варіанти параметру style: SOLID_LINE – неперервна лінія, DOTTED_LINE – точкова лінія, CENTER_LINE – штрих-пунктирна лінія, DASHED_LINE – пунктирна лінія, USERBIT_LINE – лінія, яка визначається користувачем (pattern). Можливі варіанти width (товщина): NORM_WIDTH – товщина 1 піксель, THICK_WIDTH – товщина 3 пікселя. Параметр pattern враховується тільки при стилі USERBIT_LINE,та являє собою двобайтне число, записане у шістнадцятковій формі. Воно визначає послідовність заштрихованих (1) та не заштрихованих (0) ділянок прямої. Наприклад, для отримання суцільної лінії параметр pattern=0xFFFF, штрих-пунктирної – 0x00FF;

settextstyle(int font, int direction, int size)- задає стиль і розмір тексту. Параметр font визначає тип шрифту (від 0 до 10), direction – напрямок виводу тексту зліва направо (0 або HORIZ_DIR) або знизу вверх (1 або VERT_DIR), size – множник, на який збільшується шрифт (від 0 до 10).

setviewport(int left, int top, int right, int bottom, int clip) - встановлює поточну область перегляду. Верхня ліва вершина області - (left,top), нижня права – (right,bottom). Якщо clip=1, то та частина, яка виходить за межі області, автоматично відсікається.

Приклад 1. Вивести на екран графік функції y=10sin(x)-0.2x2cos(x)+5x+7 на проміжку від -10 до 10.

#include <stdio.h>

#include <graphics.h>

#include <conio.h>

#include <math.h>

#include <float.h>

#include <stdlib.h>

void koordsystem();

/*Оголошення функції виводу системи координат*/

int graphik(float x,float xmax,float y,float ymax,int color);

/*Оголошення функції виводу точки на екран; (x,y)- координата поточної точки; xmax- максимально-можливе значення x;ymax- максимально-можливе значення y; color- колір*/

void main(void)

{int driver, mode;

float y,x;

driver=DETECT;

mode=0;

initgraph(&driver,&mode,"c:\\borlandc\\bgi");

/*Ініціалізація графічного режиму*/

setbkcolor(WHITE);

/*Встановлення кольору фону*/

koordsystem();

/*Виведення системи координат*/

x=-10;

while(x<10)

/*Організація циклу розрахунків та виведення точок графіку на екран*/

{y=10*sin(x)*x-0.2*x*x*cos(x)+5*x+7;

graphik(x,10,y,200,CYAN);

/*Виведення точки на екран*/

x=x+0.0001;}

getch();

/*Організація зависання екрану*/

restorecrtmode();

/*Відновлення текстового режиму екрану*/

}

void koordsystem()

{setcolor(RED);

line(10,getmaxy()/2,getmaxx()-10,getmaxy()/2);

line(getmaxx()/2,10,getmaxx()/2,getmaxy()-10);

/*Рисування координатних осей*/

outtextxy(getmaxx()/2+10,10,"y");

outtextxy(getmaxx()-20,getmaxy()/2+10,"x");

outtextxy(getmaxx()/2-10,getmaxy()/2+10,"0");

/*Виведення маркувань осей*/

}

int graphik(float x,float xmax,float y,float ymax,int color)

{float d,f;

d=x*(getmaxx()/2-10)/xmax;

f=y*(getmaxy()/2-10)/ymax;

putpixel(int(d+getmaxx()/2),int(-f+getmaxy()/2),color);

/*Функція int перед змінною типу float перетворює її в тип int*/

return 0;

}

1.2 Для побудови рухомих зображень зручно використовувати функції getimage() та putimage(). Функція getimage() має наступний формат:

getimage(x1,y1,x2,y2,вказівник_на_зображення);

Вона зберігає частину зображення, обмежену координатами x1,y1,x2,y2(верхнього лівого та нижнього правого кутів), в область пам’яті, на яку вказує вказівник_на_зображення. Так як розмір зображення, а тому і необхідний об’єм памяті, заздалегідь не відомий, потрібно використовувати вказівник невизначеного типу void:

void *pimage;

Для виділення пам'яті слугує функція malloc(), яка має наступний формат:

void *malloc(об'єм_пам’яті_в_байтах);

Функція повертає вказівник на необхідний об’єм пам’яті, або 0 в разі помилки.

Для визначення розміру зображення слугує функція imagesize(), яка має наступний формат:

imagesize(x1,y1,x2,y2);

Для виведення зображення на екран слугує функція putimage(). Вона має наступний формат:

putimage(x1, y1, вказівник, вид_вставки);

Тут x1, y1 – координати верхнього лівого кута зображення. Вид_вставки визначає, яким чином зображення, на яке вказує вказівник, буде виведене на екран по відношенню до вже наявного на екрані зображення. Може приймати значення: COPY_PUT – копія, XOR_PUT – виключаюче АБО, OR_PUT - АБО, AND_PUT - І, NOT_PUT – НІ.

Приклад 2. Побудувати круг, який рухається по синусоїдальній траєкторії зліва направо.

#include <stdio.h>

#include <graphics.h>

#include <dos.h>

#include <math.h>

void main(void)

{

const int r=10;

const float h=0.005, A=2, w=10, tmax=2;

int errorcode,xstart, ystart,gd=DETECT,gm=0;

double x,y;

float mx,my;

int xend, yend,xst_limit,yst_limit,xend_limit,yend_limit,size;

void *pimage;

initgraph(&gd,&gm,"C:\\TC\\BGI");

errorcode=graphresult();

if (errorcode!=grOk)

{

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

printf("Press any key to exit");

getch();

exit(1);

}

xst_limit=0.1*getmaxx();

yst_limit=0.1*getmaxy();

xend_limit=0.9*getmaxx()-2*r;

yend_limit=0.9*getmaxy()-2*r;

mx=(xend_limit-xst_limit)/(w*tmax);

my=(yend_limit-yst_limit)/(2*A);

setfillstyle(SOLID_FILL,RED);

fillellipse(xst_limit+r,(yst_limit+yend_limit)/2,r,r);

size=imagesize(xst_limit,-r+(yst_limit+yend_limit)/2,xst_limit+2*r,r+(yst_limit+yend_limit)/2);

pimage=malloc(size);

getimage(xst_limit,-r+(yst_limit+yend_limit)/2,xst_limit+2*r,r+(yst_limit+yend_limit)/2,pimage);

cleardevice();

setbkcolor(LIGHTGRAY);

x=0;

do

{

y=A*sin(x);

xstart=xst_limit+mx*x;

ystart=-r+(yst_limit+yend_limit)/2-my*y;

putimage(xstart,ystart,pimage,XOR_PUT);

delay(1);

x+=h;

putimage(xstart,ystart,pimage,XOR_PUT);

}

while(xend_limit-xstart-2*r>0);

settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);

outtextxy(0.4*getmaxx(),0.7*getmaxy(),"Press any key");

getch();

closegraph();

}

2. ЗАВДАННЯ НА РОБОТУ

Розробити та запустити у роботу програму на мові програмування “СІ”, яка вирішує задачу відповідно до заданого нижче варіанта.

2.1. Побудувати фігуру, яка складається із трьох концентричних кілець різного кольору. Фігура рухається по колу за часовою стрілкою

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

2.3. Побудувати червоний п’ятикутник, який рухається зворотно-поступально вздовж лівої частини екрана.

2.4. Побудувати жовтий круг із вписаним в нього синім прямокутником, який рухається зворотно-поступально вздовж головної діагоналі екрана.

2.5. Побудувати синій трикутник, який рухається зворотно-поступально вздовж побічної діагоналі екрана.

2.6. Побудувати графіки функцій Комп’ютерний практикум № 17 - student2.ru та Комп’ютерний практикум № 17 - student2.ru на всій області екрану при зміні X від 0 до 2. Побудувати координатну сітку, графіки виділити різними кольорами. Значення А та W задаються з клавіатури.

2.7. Побудувати графіки функцій Комп’ютерний практикум № 17 - student2.ru та Комп’ютерний практикум № 17 - student2.ru на всій області екрану при зміні X від 0 до 1. Побудувати координатну сітку, графіки виділити різними кольорами. Значення А та B задаються з клавіатури.

2.8. Побудувати графіки функцій Комп’ютерний практикум № 17 - student2.ru та Комп’ютерний практикум № 17 - student2.ru у 2 чверті екрану при зміні X від 0 до 5. Побудувати координатну сітку, графіки виділити різними кольорами. Значення А, B та W задаються з клавіатури.

2.9. Побудувати графіки функцій Комп’ютерний практикум № 17 - student2.ru та Комп’ютерний практикум № 17 - student2.ru на всій області екрану при зміні X від 0 до 3. Побудувати координатну сітку, графіки виділити різними кольорами. Значення А та W задаються з клавіатури.

2.10. Побудувати графік функції, яка визначається залежністю Комп’ютерний практикум № 17 - student2.ru при зміні X від 0 до 20. Побудувати координатну сітку, графік виділити кольором. Значення А,B,C та W задаються з клавіатури.

3. КОНТРОЛЬНІ ЗАПИТАННЯ

3.1. Яким чином ініціалізується графіний режим.

3.2. Яка функція слугує для побудови многокутників.

3.3. Яким чином будуються рухомі графічні зображення.

3.4. Як змінити зовнішній вигляд лінії в графічному режимі.

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

Комп'ютерний практикум № 18

Наши рекомендации