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

Лабы / Roma / CUBE

.CPP
Скачиваний:
20
Добавлен:
16.04.2013
Размер:
2.51 Кб
Скачать
//Џа®бв® Їа®Ј  ђ®¬л Њ®абЁ­ . ‘®§¤ Ґв  Ё ўа й Ґв ваҐе¬Ґа­л©
//Ї а ««ҐЇЁЇҐ¤ Џа®ҐЄжЁп гзЁвлў Ґв ЇҐабЇҐЄвЁўг!!!! 
#include "matrix.cpp"
#include <dos.h>
#include <conio.h>

REAL pi=3.14;
enum rotate_mode{rx=1,ry=2, rz=3};

void line3d(POINT a,POINT b) {
	line(a.vn[0],a.vn[1],b.vn[0],b.vn[1]);
};

class Cube {
protected:
	POINT p[8];
	POINT c;
public:
	Cube (POINT,POINT);
	void show();
	void hide();
	void rotate(MATRIX);
	void rotateat(POINT,MATRIX);
	void moveto(POINT);
	void Perspective();
};

Cube::Cube(POINT size,POINT center) {
	c=center;

	for (int i=0; i<8; i++) p[i].SetOffset(c.v[0],c.v[1],c.v[2]);
	REAL sx=size.v[0]/2,sy=size.v[1]/2,sz=size.v[2]/2;
	p[0].v[0]=-sx;
	p[0].v[1]=-sy;
	p[0].v[2]=-sz;

	p[1].v[0]=sx;
	p[1].v[1]=-sy;
	p[1].v[2]=-sz;

	p[2].v[0]=sx;
	p[2].v[1]=sy;
	p[2].v[2]=-sz;

	p[3].v[0]=-sx;
	p[3].v[1]=sy;
	p[3].v[2]=-sz;

	p[4].v[0]=-sx;
	p[4].v[1]=-sy;
	p[4].v[2]=sz;

	p[5].v[0]=sx;
	p[5].v[1]=-sy;
	p[5].v[2]=sz;

	p[6].v[0]=sx;
	p[6].v[1]=sy;
	p[6].v[2]=sz;

	p[7].v[0]=-sx;
	p[7].v[1]=sy;
	p[7].v[2]=sz;


};

void Cube::Perspective() {
	for (int i=0; i<8; i++) p[i].Perspective();
};

void Cube::show() {
	Perspective();
	setcolor(15);
	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 Cube::hide() {
	Perspective();
	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 Cube::rotate(MATRIX m) {
	m.Multiply(8,&p[0],&p[0]);
};

void Cube::rotateat(POINT atp,MATRIX m) {
POINT a(c);
	a-=atp;
	m.Multiply(1,&a,&a);
	a+=atp;
    c=a;
	for (int i=0; i<8; i++) p[i].SetOffset(c.v[0],c.v[1],c.v[2]);
    rotate(m);
};

void main() {
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "E:\\C3.1\\bgi");

POINT size(50,100,50);
POINT c(320,240,200);
POINT at(345,240,225);
MATRIX m;
Cube cube(size,c);
m.Identity();
REAL fi=pi/100;
c-=at;
getch();
for (REAL dfi=0; dfi<pi; dfi+=fi) {
	cube.show();
	delay(30);
	cube.hide();
	m.Yaw(fi);
	cube.rotateat(at,m);
	};
m.Identity();
while (!kbhit()) {
	cube.show();
	delay(10);
	cube.hide();
	m.Roll(fi);
	cube.rotate(m);
	};
closegraph();
};
Соседние файлы в папке Roma