Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / MY / CUBE

.CPP
Скачиваний:
22
Добавлен:
16.04.2013
Размер:
3.65 Кб
Скачать
//Њ®п Їа®Ј . ‘®§¤ Ґв ЄгЎ ваҐе¬Ґа­л© Ё ўа й Ґв ҐЈ® ў Їа®бва ­б⢥.
//Ї®¤а ¦ ­ЁҐ Їа®ЈҐ ђ®¬л Њ®абЁ­ 
#include "matrix.cpp"
#include <dos.h>
#include <iostream.h>
#define PI M_PI

void line3d(Point a,Point b)
{
	line(a.mx,a.my,b.mx,b.my);
};


// Є« бб ЄгЎ  (а ў­®бв®а®­­ҐЈ®)
class Cube3D {
       protected:
		Point p[8];     //ҐЈ® 8 ўҐаиЁ­
		Point c;
	  public:
		Cube3D (Point size,Point center);
		void Show();
		void Hide();
		void View();
		void Rotateat(Point atp,Matrix m);
		void Rotate(Matrix m);
	  };

//Є®­бвагЄв®а д®а¬Ёа®ў ­Ёп 3D ЄгЎ  Ї® ҐЈ® 業ваг Ё ᬥ饭Ёо ¤® ўҐаиЁ­
Cube3D::Cube3D(Point size,Point center)
{
    c=center;
    for (int i=0; i<8; i++) p[i].SetOffset(center.x,center.y,center.z);
    float sx=size.x,sy=size.y,sz=size.z;

	p[0].x=-sx;
	p[0].y=-sy;
	p[0].z=-sz;

	p[1].x=sx;
	p[1].y=-sy;
	p[1].z=-sz;

	p[2].x=sx;
	p[2].y=sy;
	p[2].z=-sz;

	p[3].x=-sx;
	p[3].y=sy;
	p[3].z=-sz;

	p[4].x=-sx;
	p[4].y=-sy;
	p[4].z=sz;

	p[5].x=sx;
	p[5].y=-sy;
	p[5].z=sz;

	p[6].x=sx;
	p[6].y=sy;
	p[6].z=sz;

	p[7].x=-sx;
	p[7].y=sy;
	p[7].z=sz;
}

void Cube3D::View() {
	for (int i=0; i<8; i++)
	p[i].Perspective();  //‚맮ў д-жЁЁ Є« бб  в®зЄЁ
};

//”г­ЄжЁп аЁб®ў ­Ёп ЄгЎ 
void Cube3D::Show()
{
	View();
 setcolor(GREEN);
	for (int i=0; i<3; i++) {
		line3d(p[i],p[i+1]);
		};
	line3d(p[i],p[0]);
	for (i=4; i<7; i++) {
		line3d(p[i],p[i+1]);
		};
	line3d(p[i],p[4]);
	for (i=0; i<4; i++) {
		line3d(p[i],p[i+4]);
		};
}

void Cube3D::Hide() {
	View();
	setcolor(getbkcolor());
	for (int i=0; i<3; i++) {
		line3d(p[i],p[i+1]);
		};
	line3d(p[i],p[0]);
	for (i=4; i<7; i++) {
		line3d(p[i],p[i+1]);
		};
	line3d(p[i],p[4]);
	for (i=0; i<4; i++) {
		line3d(p[i],p[i+4]);
		};
}

void Cube3D::Rotate(Matrix m)
{
	m.Multiply(8,&p[0],&p[0]);
}

void Cube3D::Rotateat(Point atp,Matrix m)
{
 Point a(c);                  //ᮧ¤ Ґ¬ Є®ЇЁо 業ва  ЄгЎ 
	a-=atp;               //ᬥ頥¬ нвг Є®ЇЁо,в Є зв® Ў ®­  б®ўЇ «  б OY
	m.Multiply(1,&a,&a);
	a+=atp;
	c=a;
	for (int i=0; i<8; i++) p[i].SetOffset(c.x,c.y,c.z);
    Rotate(m);
};


void main()
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;

/* initialize graphics mode */
initgraph(&gdriver, &gmode, "E:\\C3.1\\bgi");

/* read result of initialization */
errorcode = graphresult();

if (errorcode != grOk)  /* an error occurred */
{
   printf("Graphics error: %s\n", grapherrormsg(errorcode));
   printf("Press any key to halt:");
   getchar();
   exit(1);             /* return with error code */
}

 Point size(50,50,50);
 Point p1(320,240,200);
 Cube3D cube1(size,p1);
 cube1.Show();
/////////////­ зЁ­ Ґ¬ ¤г¬ вм/////////////////////////

Point at(320,240,200);
Matrix m;            //Є« бб ¬ ваЁжл ¤«п ўа йҐ­Ёп дЁЈгал
m.Identity();        //­  Їап¬го ᮧ¤ Ґ¬ ¤Ё Ј®­ «м­го ¬ ваЁжг
		     //Ї®в®¬ ¤®Ї®«­Ё¬ ¤«п ЇаҐ®Ўа §®ў ­Ё©
float fi=PI/100;     //¬ «Ґ­мЄЁҐ гЈ®«ЄЁ ­  Є®в®алҐ Ўг¤Ґ¬ ўа й вм
p1-=at;              //ᬥ頥¬ 業ва ЄгЎ ,в Є зв® Ў ®­ б®ўЇ « б OY
getchar();
for (float dfi=0; dfi<PI*2; dfi+=fi) {
	cube1.Show();
	delay(10);
	cube1.Hide();
	m.Rotate_Y(fi);              //Ї®¤бзҐв ¬ ваЁжл ¤«п ўа йҐ­Ёп ў®ЄагЈ Y
	cube1.Rotateat(at,m);        //Ї®ў®а®в
	};
	cube1.Show();
getchar();

Point at1(320,240,200);
Matrix m1;
m.Identity();
p1-=at1;
for (dfi=0; dfi<PI*2; dfi+=fi) {
	cube1.Show();
	delay(10);
	cube1.Hide();
	m1.Rotate_X(fi);              //Ї®¤бзҐв ¬ ваЁжл ¤«п ўа йҐ­Ёп ў®ЄагЈ Y
	cube1.Rotateat(at1,m1);        //Ї®ў®а®в
	};
	cube1.Show();
getchar();
closegraph();
}

Соседние файлы в папке MY