Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//Џа®бв® Їа®Ј ђ®¬л Њ®абЁ . ‘®§¤ Ґв Ё ўа й Ґв ваҐе¬Ґал©
//Ї а ««ҐЇЁЇҐ¤ Џа®ҐЄжЁп гзЁвлў Ґв ЇҐабЇҐЄвЁўг!!!!
#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();
};