Скачиваний:
37
Добавлен:
15.09.2014
Размер:
60.42 Кб
Скачать

Белорусский государственный университет

информатики и радиоэлектроники

Кафедра ЭВМ

Отчет по лабораторной работе

Тема: «Работа с видеоадаптером»

Выполнил:

студент группы 750501 Демидовец А.Г.

Проверил:

к.т.н., доцент __________________ Одинец Д.Н.

Минск

2009

Постановка задачи № 1

Написать программу – заставку «Матрица». Работа должна

производиться в текстовом режиме работы видеоадаптера. Символы выводятся сверху вниз, цвет символа должен изменятся. Работа организуется или при помощи функций 10 прерывания или напрямую работает с памятью. Набор символов используемых для реализации задания выдается преподавателем.

Алгоритм программы:

Главная программа выполняет такие действия:

  1. Устанавливает режим работы видеоадаптера с помощью функции set_mode();

  2. Пока не нажата любая клавиша, выполняет действие 3.

  3. Выводит на экран «падающие буквы».

Текст программы:

#include <dos.h>

#include <conio.h>

#include <stdlib.h>

#include <stdio.h>

void set_mode(int mode)

{

_AH = 0x00;

_AL = mode;

geninterrupt(0x10);

}

void goto_xy(int x, int y)

{

_AH = 0x02;

_BH = 0;

_DH = y;

_DL = x;

geninterrupt(0x10);

}

int colour()

{

int a = random(16);

while (a == 0)

a = random(16);

return a;

}

void set_video(int nomer)

{

_AH = 0x05;

_AL = nomer;

}

char read_sim()

{

char x;

_AH = 0x08;

_BH = 0;

geninterrupt(0x10);

x = _AL;

return x;

}

void print_sim(char *str, int atr)

{

_AH = 0x09;

_BH = 0;

_AL = *str;

_CX = 1;

_BL = atr;

geninterrupt(0x10);

}

main()

{

char *ch, buf;

char str[25] = "Zhuravlevich Pavel 750505";

char st[25];

int p[80];

int i, j, a, g = 0, kk, t, k;

set_mode(2);

set_video(0);

cputs("Vvedite vremya raboti programmi v sekyndah!\n\r");

scanf("%d",&t);

t = t* 10;

clrscr();

randomize();

for (g=0; g<80; g++)

{

p[g] = random(25);

i = 0;

for (j=p[g]; j>=0; j--)

{

st[j] = str[i];

i++;

*ch = st[j];

a = colour();

goto_xy(g, j);

print_sim(ch, a);

}

}

goto_xy(25,24);

cputs("Press any key to enter matrix!");

getch();

while(t>=0)

{

for (g=0; g<80; g++)

{

if (p[g]<24)

{

k = 0;

for (j=p[g]; j>=0; j--)

{

st[j] = str[k];

k++;

}

for (i=p[g]; i>=0; i--)

{

goto_xy(g, i);

*ch = read_sim();

a = colour();

goto_xy(g, i+1);

st[i+1] = *ch;

print_sim(ch, a);

if (i == 0)

{

goto_xy(g, i);

a = colour();

kk = p[g] + 1;

st[0] = str[kk];

p[g] = kk;

*ch = st[0];

print_sim(ch, a);

}

}

}

else

{

for (i=0; i<25; i++)

{

goto_xy(g, i);

st[i] = read_sim();

}

buf = st[24];

for (i = 24; i>0; i--)

st[i]=st[i-1];

st[0] = buf;

for (i = 0; i<25; i++)

{

goto_xy(g, i);

*ch = st[i];

a = colour();

print_sim(ch, a);

}

}

}

delay(50);

t--;

}

//getch();

clrscr();

goto_xy(0, 0);

cputs("Press any key to exit!");

getch();

return 0;

}

Результаты работы программы

Во время работы программы на экран выводится заставка «Матрица»

Постановка задачи № 2

Необходимо вывести на экран 3-d объект (куб, пирамида и т.п.) и вращать его вокруг одной из осей. Тип объекта задается преподавателем. При работе должен использоваться графический режим работы видеоадаптера. Для прорисовки объекта на экране должны использоваться функции 10 прерывания. Направление вращения объекта задается при помощи стрелок курсора.

Алгоритм программы:

Главная программа выполняет такие действия:

    1. Устанавливает режим работы видеоадаптера с помощью функции set_mode();

    2. Пока не нажата не управляющая клавиша, выполняет действие 3.

    3. Отображает на экране трёхмерную фигуру.

    4. При нажатии на управляющие клавиши «вверх», «вниз», «влево», «вправо» фигура начинает вращаться в заданном направлении, при нажатии «+», «-» приближается либо удаляется.

Текст программы:

#include <dos.h>

#include <conio.h>

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#define r 5

#define xmax 320

#define ymax 200

#define byte unsigned char

int razm = 30;

class Point

{

public:

float X, Y, Z;

Point(float x, float y, float z)

{

X = x;

Y = y;

Z = z;

}

void RotateZ(float a)

{

float xnew, ynew;

xnew = X * cos(a) - Y * sin(a);

ynew = X * sin(a) + Y * cos(a);

X = xnew; Y = ynew;

}

void RotateY(float a)

{

float xnew, znew;

xnew = X * cos(a) - Z * sin(a);

znew = X * sin(a) + Z * cos(a);

X = xnew; Z = znew;

}

void RotateX(float a)

{

float znew, ynew;

ynew = Y * cos(a) - Z * sin(a);

znew = Y * sin(a) + Z * cos(a);

Z = znew; Y = ynew;

}

} ;

void print_pixel(int color, int x, int y)

{

_AH = 0x0C;

_AL = color;

_BH = 0;

_CX = x;

_DX = y;

geninterrupt(0x10);

}

void set_mode(int mode)

{

_AH = 0x00;

_AL = mode;

geninterrupt(0x10);

}

void set_list()

{

_AH = 0x05;

_AL = 0;

}

void line(int color, int a, int b, int c, int d)

{

float x, y, xx, yy;

float X,Y, k;

X = Y;

Y = X;

print_pixel(color, a, b);

if(a > c) x = (a - c);

else x = (c - a);

if(b > d) y = (b - d);

else y = (d - b);

if(x > y) k = x;

else k = y;

x = x / k;

y = y / k;

X = c;

Y = d;

for(int i = 0; i < k; i++)

{

if(a > c) X += x;

else X -= x;

if(b > d) Y += y;

else Y -= y;

print_pixel(color, X, Y);

}

}

int getX(float x, float z)

{

return ((int) (xmax / 2 + (r * x * razm) / (r - z)));

}

int getY(float y, float z)

{

return ((int) (ymax / 2 + (r * y * razm) / (r - z)));

}

void rotate(int color,Point *p, float angleX, float angleY)

{

for (int i = 0; i < 8; ++i)

{

p[i].RotateY(angleY);

p[i].RotateX(angleX);

p[i].RotateZ(0.0);

}

for(int j = 0; j < 8; j++)

{

if(j == 7)

{

line(color, getX(p[j].X,

p[j].Z), getY(p[j].Y, p[j].Z),

getX(p[0].X, p[0].Z), getY(p[0].Y, p[0].Z));

break;

}

line(color, getX(p[j].X, p[j].Z), getY(p[j].Y, p[j].Z),

getX(p[j+1].X, p[j+1].Z),getY(p[j+1].Y, p[j+1].Z));

}

line(color, getX(p[0].X, p[0].Z), getY(p[0].Y, p[0].Z),

getX(p[3].X, p[3].Z), getY(p[3].Y, p[3].Z));

line(color, getX(p[1].X, p[1].Z), getY(p[1].Y, p[1].Z),

getX(p[6].X, p[6].Z), getY(p[6].Y, p[6].Z));

line(color, getX(p[2].X, p[2].Z), getY(p[2].Y, p[2].Z),

getX(p[5].X, p[5].Z), getY(p[5].Y, p[5].Z));

line(color, getX(p[4].X, p[4].Z), getY(p[4].Y, p[4].Z),

getX(p[7].X, p[7].Z), getY(p[7].Y, p[7].Z));

delay(50);

}

int main()

{

set_mode(0x13);

set_list();

float angleX = 0.0;

float angleY = 0.5;

int i, j, color = 10;

Point *p = (Point*)calloc(8, sizeof(Point));

p[4] = Point(1, 1, 1);

p[5] = Point(1, 1, -1);

p[6] = Point(1, -1, -1);

p[7] = Point(1, -1, 1);

p[0] = Point(-1, -1, 1);

p[1] = Point(-1, -1, -1);

p[2] = Point(-1, 1, -1);

p[3] = Point(-1, 1, 1);

printf("Press any key...");

while(1)

{

if( kbhit() )

{

clrscr();

puts(" a - vlevo, d - vpravo, s - vniz ");

puts(" w - vverh, c - izm.cveta ");

puts(" + - yvel., - - ymensh., q - exit ");

rotate(color, p, angleX, angleY);

char a;

a = getch();

switch(a)

{

case 'a': angleX += 0.01;

break;

case 'd': angleX -= 0.01;

break;

case 's': angleY -= 0.01;

break;

case 'w': angleY += 0.01;

break;

case '+': razm += 2;

break;

case '-': razm -= 2;

break;

case 'c': color = random(256);

break;

case 'q': return 0;

default: break;

}

}

fflush(stdin);

}

free(p);

return 0;

}

Результаты работы программы

Во время работы программы на экран выводится трёхмерная фигура.

7

Соседние файлы в папке 2. видеоадаптер