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