Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Po_12S.docx
Скачиваний:
4
Добавлен:
11.09.2019
Размер:
127.85 Кб
Скачать

Л а б о р а т о р н а р о б о т а № 12

Використання екрану в графічному режимі. Побудова простих рухомих графічних зображень

Ц і л ь р о б о т и : побудова простих зображень на екрані в графічному режимі. Вивчення засобів мови С++, призначених для розробки графічних програм. Отримання практичних навичок розробки графічних програм.

  1. Використання екрану в графічному режимі

Сучасний ПК має у своєму складі графічну підсистему, яка поєднує в собі дві складові: апаратну і програмну. В залежності від технічних характеристик встановленого на ПК обладнання (дисплей, графічний контролер, обслуговуючий інтерфейс) і програмного забезпечення (БСВВ, ОС, драйвери, спеціалізовані прикладні мови програмування), показники якості зображень можуть відрізнятися дуже суттєво. Так, відеопідсистеми з офісними дисплеями можуть підтримувати розрізнювальну здатність екрану по горизонталі 3840, а по вертикалі 2400 точок (пікселів); екрани мобільних телефонів – від 320×200.

Версія Microsoft Visual C++ з MFC – бібліотекою у взаємодії з графічним драйвером EGAVGA.BGI, установленими на комп’ютерах навчальних класів університету, підтримує найбільш поширений графічний режим №2 – VGAHI.

Екран дисплею в цьому режимі підтримує розрізнювальну здатність 640×480 пікселів, колір яких може встановлюватися із 16 можливих

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

.

// Це – про текстовий режим екрану(на доопрацюванні)

В модулі conio.h зберігаються константи стандартних кольорів:

Константа

Значення

Константа

Значення

Black

0

Чорний

DarkGray

8

темно-сірий

Blue

1

синій

LightBlue

9

світло-синій

Green

2

зелений

LightGreen

10

світло-зелений

Cyan

3

бірюзовий

LightCyan

11

світло-бірюзовий

Red

4

червоний

LightRed

12

рожевий

Magenta

5

малиновий

LightMagenta

13

світло-малиновий

Brown

6

коричневий

Yellow

14

жовтий

LightGray

7

світло-сірий

White

15

білий

Blink

128

блимаючий

Символи в текстовому режимі можуть мати будь-який колір із поданих в таблиці, а колір фону – тільки перші вісім – від BLACK до LIGHTGRAY.

Встановити колір символів на екрані можна за допомогою процедури textcolor();

колір фону, на який будуть виводитись символи – процедурою textbackground();

яскравість символів регулюється процедурами lowvideo() (зниження яскравості), highvideo() (підвищення яскравості) і normvideo() (установлення яскравості, яка була встановлена при запуску програми). Приклади:

textbackground(BROWN); //коричневий колір фону}

textcolor(WHITE); //білий колір символів }

textcolor(YELLOW+BLINK); //жовті символи блимаючі}

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

Якщо розглядати двійковий формат (байт) змінної textattr, то будемо мати:

  • кожен двійковий розряд несе інформацію тільки про один колір, який має бути або активним (1), або пасивним (0);

  • перша тетрада (розряди 0..3) – колір символів:

    • 0-й біт – синій;

    • 1-й біт – зелений;

    • 2-й біт – червоний;

    • 3-й біт – яскравість;

  • друга тріада (розряди 4..6) – колір фону:

    • 4-й біт – синій;

    • 5-й біт – зелений;

    • 6-й біт – червоний;

  • останній (7-й) біт вмикає або вимикає блимання символів.

Приклади:

1) textattr:=16*BLUE+WHITE; //множник 16 вказує, що йдеться про фон}

//(множення на 16 здвигає двійкові розряди}

// на 4 позиції вліво) }

2) textattr:=16*1+15; //колір фону синій, символи – білі }

3) textattr:=128+16*1+15; //додано блимання }

4) textattr:=159; // те ж саме, що в прикладі 3) }

С++ може підтримувати кілька текстових режимів роботи дисплея:

Ідентифікатор режиму (константа)

Значення

константи

Опис режиму

LASTMODE

-1

Повернення до режиму, передуючого поточному

BW40

0

Чорно-білий, 40 символів у рядку

C40

1

Кольоровий, 40 символів у рядку

BW80

2

Чорно-білий, 80 символів у рядку

C80

3

Кольоровий, 80 символів у рядку

MONO

7

Монохромний, 80 символів у рядку

C4350

64

EGA/VGA, 43 або 50 рядків

C++ дає можливісить виводити інформацію в текстовому режимі не на весь екран, а в обмеженій його області (вікні). Для встановлення параметрів (положення та розміри) вікна використовується процедура window(x1,y1,x2,y2), в якій x1 і y1 визначають координати верхнього лівого кута вікна, а x2 та y2 – правого нижнього. Після установки вікна більшість функцій модуля conio.h (clreol, clrscr, delline, gotoxy, insline, wherex, wherey і ряд інших) працюють відносно його системи координат. Це такі функції, як:

clrscr() – звільняє (очищає) вікно і установлює курсор в лівий верхній його кут;

clreol() – стирає всі символи від курсора до кінця рядка;

delline() – видаляє (знищує) рядок, на якому знаходиться курсор;

cgets() – читає з клавіатури послідовність символів;

cputs() – виводить на екран послідовність символів;

gettext() – копіює задану область тексту з екрана в буферну область пам’яті;

gettextinfo() – повертає таблицю характеристик поточного текстового режиму;

gotoxy() – установлює курсор на вказану позицію вікна;

insline() – вставляє чистий рядок перед тим рядком, в якому знаходиться курсор;

puttext() – виводить інформацію із пам’яті в задану на екрані область;

textmode() – встановлює заданий параметром режим роботи дисплея;

wherex() – функція повертає результатом номер позиції, в якій знаходиться курсор;

wherey() – функція повертає результатом номер рядка, в якому знаходиться курсор;

  1. Короткий опис бібліотеки графічних функцій

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

Графічні функції

arc(int x, int y, int stangle, int endangle, int radius) – дуга,

де х,у – координати центра;

stangle - початок (кут);

endangle – кінець (кут);

radius – радіус дуги;

circle(int x, int y, int radius) – коло з центром в точці х, у, радіусом radius;

pieslice(int x, int y, int stangle, int endangle, int radius);

cleardevice(void);

clearviewport(void);

closegraph(void);

detectgraph(int far *graphdriver, int far *graphmode);

drawpoly(int numpoints, int far *polypoints);

fillpoly(int numpoints, int far *polypoints);

ellipse(int x, int y, int stangle, int endangle,

int xradius, int yradius);

fillellipse(int x, int y,int xradius, int yradius);

sector(int x, int y, int stangle, int endangle,

int xradius, int yradius);

floodfill(int x, int y, int border);

getarccoords(struct arccoordstype far *arccoords);

getaspectratio(int far *xasp, int far *yasp);

setaspectratio(int xasp, int yasp);

getbkcolor(void);

setbkcolor(int color);

getcolor(void);

setcolor(int color);

getdefaultpalette(void);

getpalette(struct palettetype far *palette);

setallpalette(struct palettetype far *palette);

setgraphbufsize(unsigned bufsize);

getdrivername(void);

getfillpattern(char far *pattern);

setfillpattern(char far *upattern, int color);

getfillsettings (struct fillsettingstype far *fillinfo);

getgraphmode(void);

setgraphmode(int mode);

getimage(int left, int top, int right, int bottom,

void far *bitmap);

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

getlinesettings(struct linesettingstype far *lineinfo);

getmaxcolor(void);

getmaxmode(void);

getmaxx(void);

getmaxy(void);

getmodename(int mode_number);

getmoderange(int graphdriver, int far *lomode, int far*himode);

getdefaultpalette(void);

getpalette(struct palettetype far *palette);

setallpalette(struct palettetype far *palette);

getpalettesize(void);

getpixel(int x, int y);

putpixel(int x, int y, int color);

gettextsettings(struct textsettingstype far *texttypeinfo);

getviewsettings (struct viewporttype far *viewport);

getx(void);

gety(void);

graphdefaults(void);

grapherrormsg(int errorcode);

_graphfreemem(void far *ptr, unsigned size);

_graphgetmem(unsigned size);

_graphfreemem(void far *ptr, unsigned size);

_graphgetmem(unsigned size);

graphresult(void);

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

initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver);

installuserdriver(char far *name, int huge (*detect)(void));

installuserfont(char far *name);

line(int x1, int y1, int x2, int y2);

linerel(int dx, int dy);

lineto(int x, int y);

moverel(int dx, int dy);

moveto(int x, int y);

outtext(char far *textstring);

outtextxy(int x, int y, char far *textstring);

rectangle(int left, int top, int right, int bottom);

registerbgidriver(void (*driver)(void));

registerfarbgidriver(void far *driver);

registerbgifont(void (*font)(void));

registerfarbgifont(void far *font);

restorecrtmode(void);

setactivepage(int page);

setvisualpage(int page);

setgraphbufsize(unsigned bufsize);

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

setrgbpalette(int colornum, int red, int green, int blue);

settextjustify(int horiz, int vert);

settextstyle(int font, int direction, int charsize);

setusercharsize(int multx, int divx, int multy, int divy);

setviewport(int left, int top, int right, int bottom, int clip);

setactivepage(int page);

setvisualpage(int page);

setwritemode(int mode);

textheight(char far *textstring);

textwidth(char far *textstring);

CONSTANTY:

struct arccoordstype {

int x, y; /* center point of arc*/

int xstart, ystart; /* start position */

int xend, yend; /* end position */

};

COLORS (text mode)

ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ³Back-³Fore-

Constant ³Value³grnd?³grnd?

ННННННННННННННШНННННШНННННШННННН

BLACK ³ 0 ³ Yes ³ Yes

BLUE ³ 1 ³ Yes ³ Yes

GREEN ³ 2 ³ Yes ³ Yes

CYAN ³ 3 ³ Yes ³ Yes

RED ³ 4 ³ Yes ³ Yes

MAGENTA ³ 5 ³ Yes ³ Yes

BROWN ³ 6 ³ Yes ³ Yes

LIGHTGRAY ³ 7 ³ Yes ³ Yes

DARKGRAY ³ 8 ³ No ³ Yes

LIGHTBLUE ³ 9 ³ No ³ Yes

LIGHTGREEN ³ 10 ³ No ³ Yes

LIGHTCYAN ³ 11 ³ No ³ Yes

LIGHTRED ³ 12 ³ No ³ Yes

LIGHTMAGENTA ³ 13 ³ No ³ Yes

YELLOW ³ 14 ³ No ³ Yes

WHITE ³ 15 ³ No ³ Yes

ДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДД

BLINK ³128 ³ No ³ ***

  1. Контрольні запитання та завдання

  1. Які управляючі конструкції повторення підтримуються в С++?

  2. Визначити синтаксис оператора повторення з параметром.

  3. Описати послідовність дій оператора повторення з параметром.

  4. Привести приклад програмування повторень (циклічних дій), якщо їх число визначено до початку циклу.

  5. В чому заключається різниця в синтаксисі оператора for для випадків коли параметр циклу зростає, та коли він зменшується?

  6. Які найбільш характерні помилки використання оператора for вам відомі?

  7. Визначити синтаксис оператора повторення з передумовою за допомогою синтаксичної діаграми.

  8. Як виконується оператор циклу з передумовою while (послідовність)?

  9. Визначити синтаксис оператора повторення з постумовою за допомогою синтаксичної діаграми.

  10. Описати послідовність виконання оператора циклу з постумовою dowhile.

  11. В чому полягають принципові відмінності між операторами while і dowhile?

  12. Які існують відмінності та особливості при використанні операторів dowhile, while та for?

  13. Привести приклади моделювання “безкінечного циклу” операторами повторень мови програмування С++.

  14. Які координати мають точки кутів екрану в текстовому режимі? Які можуть мати за побажанням програміста?

  15. Яка процедура призначена для очищення екрана в текстовому режимі і в якому заголовковому (бібліотечному) файлі вона знаходиться?

  16. Які значення можуть приймати константи кольору для символів та фону?

  17. Яку структуру має байт атрибутів кольорів?

  18. Яким чином можна установити ”своє” вікно (змінити положення та розміри) на екрані в текстовому режимі?

  19. Які параметри має вікно (текстовий режим), коли воно установлюється автоматично?

  20. Якими засобами можна отримувати найпростіші звукові сигнали і для чого вони можуть пригодитися?

  21. Написати фрагмент програми для виводу трьох-п’яти різнокольорових рядків тексту на екран з одним блимаючим елементом (частина рядка). Останній рядок повинен мати атрибути текстового режиму, які передували Вашій програмі.

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

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

  3. Написати фрагмент програми для виводу текстового рядка в графічному режимі, розмістивши його вертикально справа від рисунка. Колір тексту синій.

  4. Пояснити призначення і використання функції settextjustify().

  5. Пояснити призначення і використання функції settextstyle().

  6. Чим відрізняються графічні функції line(), lineto(), linerel()?

  7. Які функції є в графічних бібліотеках С++ для побудови геометричних фігур на екрані? Навести приклади використання.

  8. Особливості використання функції floodfille().

  9. Пояснити призначення і використання функції setfillstyle().

  1. Завдання для самостійного виконання:

Завдання 12-1:

Написати програму, яка переводить комп’ютер в графічний режим відображення інформації і виводить на екран простий рисунок (візир), .

№ вар.

Рисунок

№ вар.

Рисунок

№ вар.

Рисунок

Завдання 12-2:

Побудувати на екрані криву по заданому параметричному рівнянню.

Режим дисплею графічний (graphics_mode VGAHI 640×480). Графік кривої виводити лінією, характеристики якої (стиль, товщина, колір) задавати довільно .

№№ вар.

Параметричне рівняння кривої

№№ вар.

Параметричне рівняння кривої

1,

17

9,

25

2,

18

10,

26

3,

19

11,

27

4,

20

12,

28

5,

21

13,

29

6,

22

14,

30

7,

23

15,

31

8,

24

16,

32

Завдання 12-3:

Скласти програму, яка будує на екрані графік функції рухомим візиром із завдання 12-1.

(Крива графіка з’являється із кінчика стрілки; швидкість руху стрілки 1...2,5 см/сек; стрілка – напівпрозора; рух візира супроводжується звуковим сигналом змінної тональності).

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