Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:АВМиС - Лабы / 2. видеоадаптер / 2.2 / Kybaedr(AMVIS2.2)
.CPP#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;
}