Скачиваний:
33
Добавлен:
15.09.2014
Размер:
3.83 Кб
Скачать
#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;
}