ПОБУДОВА ПРОСТИХ РУХОМИХ ГРАФІЧНИХ ЗОБРАЖЕНЬ
Лабораторна робота №12
ВИКОРИСТАННЯ ЕКРАНУ В ГРАФІЧНОМУ РЕЖИМІ.
ПОБУДОВА ПРОСТИХ РУХОМИХ ГРАФІЧНИХ ЗОБРАЖЕНЬ
(Варіант №8)
М е т а р о б о т и : побудова простих зображень на екрані в графічному режимі.
Вивчення засобів мови С++, призначених для розробки графічних програм. Отримання практичних навичок розробки графічних програм.
Використання екрану в графічному режимі
Сучасний ПК має у своєму складі графічну підсистему, яка поєднує в собі дві складові: апаратну і програмну. В залежності від технічних характеристик встановленого на ПК обладнання (дисплей, графічний контролер, обслуговуючий інтерфейс) і програмного забезпечення (БСВВ, ОС, драйвери, спеціалізовані прикладні мови програмування), показники якості зображень можуть відрізнятися дуже суттєво. Так, відеопідсистеми з офісними дисплеями можуть підтримувати розрізнювальну здатність екрану по горизонталі 3840, а по вертикалі 2400 точок (пікселів); екрани мобільних телефонів – від 320×200.
Версія Microsoft Visual C++ з MFC – бібліотекою у взаємодії з графічним драйвером EGAVGA.BGI, установленими на комп’ютерах навчальних класів університету, підтримує найбільш поширений графічний режим №2 – VGAHI.
Екран дисплею в цьому режимі підтримує розрізнювальну здатність 640×480 пікселів, колір яких може встановлюватися із 16 можливих
Перша координата (х) змінюється по горизонталі зліва направо, а друга координата (у) змінюється по вертикалі зверху донизу. Початок відліку – верхній лівий кут – має координати (0,0).
.
// Це – про текстовий режим екрану(на доопрацюванні)
В модулі conio.h зберігаються константи стандартних кольорів:
Константа | Значення | Константа | Значення | |||
Black | Чорний | DarkGray | темно-сірий | |||
Blue | синій | LightBlue | світло-синій | |||
Green | зелений | LightGreen | світло-зелений | |||
Cyan | бірюзовий | LightCyan | світло-бірюзовий | |||
Red | червоний | LightRed | рожевий | |||
Magenta | малиновий | LightMagenta | світло-малиновий | |||
Brown | коричневий | Yellow | жовтий | |||
LightGray | світло-сірий | White | білий | |||
Blink | блимаючий | |||||
Символи в текстовому режимі можуть мати будь-який колір із поданих в таблиці, а колір фону – тільки перші вісім – від BLACK до LIGHTGRAY.
Встановити колір символів на екрані можна за допомогою процедури textcolor();
колір фону, на який будуть виводитись символи – процедурою textbackground();
яскравість символів регулюється процедурами lowvideo() (зниження яскравості), highvideo() (підвищення яскравості) і normvideo() (установлення яскравості, яка була встановлена при запуску програми). Приклади:
textbackground(BROWN); //коричневий колір фону}
textcolor(WHITE); //білий колір символів }
textcolor(YELLOW+BLINK); //жовті символи блимаючі}
Крім наведених констант в модулі conio.h є спеціальна, заздалегідь визначена змінна textattr, якою можна користовуватись замість вищезгаданих функцій. Ця змінна в кожен момент має ціле числове значення і визначає всі атрибути кольорів (символів, фону, яскравості, блимання).
Якщо розглядати двійковий формат (байт) змінної textattr, то будемо мати:
- кожен двійковий розряд несе інформацію тільки про один колір, який має бути або активним (1), або пасивним (0);
- перша тетрада (розряди 0..3) – колір символів:
o 0-й біт – синій;
o 1-й біт – зелений;
o 2-й біт – червоний;
o 3-й біт – яскравість;
- друга тріада (розряди 4..6) – колір фону:
o 4-й біт – синій;
o 5-й біт – зелений;
o 6-й біт – червоний;
- останній (7-й) біт вмикає або вимикає блимання символів.
Завдання 12-1: Написати программу, яка створить на екрані малюнок
Програма:
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<dos.h>
int main ()
{
clrscr();
int gdriver=DETECT,gmode, errorcode;
int size,i;
float x,y,t;
initgraph(&gdriver, &gmode, "");
errorcode=graphresult();
if (errorcode !=grOk)
{
printf("Graphics error: %s \n",grapherrormsg(errorcode));
printf("Pres any key to halt:");
getch();
exit(1);
}
/* line(0,0,getmaxx(),getmaxy());
moveto(300,300);
ellipse(300,300,35,150,50,25);
ellipse(340,310,90,180,50,25);
ellipse(308,300,150,200,20,25);
ellipse(275,335,73,113,50,50);
getch();
linerel(25,-25);
bar3d(320,240,360,280,10,50);
size=imagesize(320,220,380,280);
int *p=new[size];
getimage(320,220,380,280,p);
putimage(520,240,p,1);
for(i=1;i,500;i+=5)
{ putimage(x,y,p,1);
t=i/180.0*M_PI;
x=100*sin(t)+320;
y=240-100*cos(t);
putimage(x,y,p,1);
delay(50);
}
getch();
closegraph();
delete p;*/
moveto(300,250);
linerel(30,0);
linerel(-10,10);
linerel(30,30);
linerel(-10,10);
linerel(-30,-30);
linerel(-10,10);
linerel(0,-30);
setfillstyle(2,8);
floodfill(305,255,WHITE);
getch();
return 0;
}
Завдання 12-2: Написати програму яка створює на осі координат фігуру
Програма:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
void main()
{
float x,y;
int xe,ye;
int gd=DETECT,gm,er;
int *p;
initgraph(&gd,&gm,"");
moveto(100,100);
linerel(30,0);
linerel(-10,10);
linerel(30,30);
linerel(-10,10);
linerel(-30,-30);
linerel(-10,10);
linerel(0,-30);
setfillstyle(2,9);
floodfill(105,105,WHITE);
int size=imagesize(100,100,150,150);
p=new[size];
getimage(100,100,150,150,p);
getch();
// putimage(250,200,p,0);
line(10,240,630,240);
line(320,10,320,470);
outtextxy(330, 0, "Y");
outtextxy(630, 250, "X");
outtextxy(310, 250, "0");
float t=0,
dt=0.01;
double r=100.0;
moveto(320,240);
sound(300);
while (t<=2*M_PI)
{
putimage(xe,ye,p,1);
x=r*pow(cos(t),2);
y=r*pow(sin(t),2);
xe=int(x+320);
ye=int(240-y);
putimage(xe,ye,p,1);
lineto(xe,ye);
t+=dt;
delay(10);
}
nosound;
getch();
closegraph();
}
Завдання 12-3: Написати программу, яка рухає малюнок по фігурі, у супроводі звукових ефектів
Програма:
#include<conio.h>
#include<math.h>
#include<dos.h>
#include<stdio.h>
#define ARROW_size 40
void draw_arrow (int x, int y);
int main (void)
{
int gdriver=DETECT, gmode, errorcode;
void*arrow;
int Y_dek,x_dek,x,y,maxx;
unsigned int size;
initgraph (&gdriver,&gmode,””);
errorcode=graphresult();
if (errorcode !=gr0k)
{
printf(“Graphics error: %s\n”,grapherrormsg(errorcode));
printf(“ Press any key to halt:”);
getch();
exit(1);
}
maxx=getmaxx();
x=0;
y=getmaxy()/5;
draw_arrow(x,y);
size=imagesize(x,y-ARROW_SIZE,x+(4*ARROW_SIZE), y+ARROW_SIZE);
arrow=malloc (size);
getimage (x,y-ARROW_SIZE, x+(4*ARROW_SIZE), y+ARROW_SIZE, arrow);
putimage( x,y-ARROW_SIZE, arrow, XOR_put);
float t=0.0, dt=0.01;
float r=100;
x_ek, y_ek;
moveto(r*pow(cos(t),3)+320,240-r*sin(t)*cos(t)*cos(t);
while(t<=9.0)
{
putimage(x_ek-100,y_ek-45, arrow, XOR_PUT);
x_dek=r*pow(cos(t),3);
y_dek=r*sin(t)*cos(t)*cos(t);
x_ek=(x_dek+320);
y_ek=(240-y_dek);
sound(6661299*(x_ek+(-y_ek)));
lineto (x_ek; y_ek);
putimage (x_ek-100; y_ek-45; arrow, XOR_PUT);
delay (1);
t=t+dt;
}
nosound ();
getch ();
free(arrow);
closegraph ();
return 0;
}
void draw_arrow (int x, int y)
{
line(20,240,620,240);
line (329,20,320,460);
moveto (50,50);
linerel(40,-40);