Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include "matrix.cpp"
REAL pi=3.14;
enum axis {X=0,Y=1,Z=2};
class POLYGON {
protected:
int *poly;
POINT *Vertecies;
REAL MidZ;
int nVerts;
int color;
MATRIX m;
void draw_poly();
void Project();
REAL CalculateMidZ();
public:
POLYGON(){};
~POLYGON();
POLYGON(int, POINT *, int);
void Set(int,POINT *,int);
void Set_color(int);
void Rotate(axis,REAL);
void ZoomIN(int);
void ZoomOUT(int);
void MoveX(int,int);
void MoveY(int,int);
REAL GetMidZ();
void Draw();
void Hide();
};
POLYGON::POLYGON(int n, POINT *vtx, int ic) {
MidZ=0;
color=ic;
nVerts=n;
Vertecies=vtx;
CalculateMidZ();
};
REAL POLYGON::CalculateMidZ() {
int i;
MidZ=0.0;
for (i=0; i<nVerts; i++) MidZ+=Vertecies[i].v[2];
MidZ/=nVerts;
return MidZ;
};
POLYGON::~POLYGON() {
Vertecies=NULL;
};
void POLYGON::Set(int n, POINT *vtx, int ic) {
color=ic;
nVerts=n;
Vertecies=vtx;
CalculateMidZ();
};
void POLYGON::Draw() {
Project();
setcolor(color);
setfillstyle(SOLID_FILL,color);
draw_poly();
};
void POLYGON::Hide() {
setcolor(0);
setfillstyle(SOLID_FILL,0);
draw_poly();
};
void POLYGON::Project() {
int i,k=0;
for (i=0; i<nVerts; i++) {
Vertecies[i].Perspective();
poly[k]=Vertecies[i].vn[0];
poly[k+1]=Vertecies[i].vn[1];
k+=2;
};
poly[k]=poly[0];
poly[k+1]=poly[1];
};
void POLYGON::draw_poly() {
fillpoly(nVerts,poly);
//drawpoly(nVerts+1,poly);
};
void POLYGON::Set_color(int ic) {
color=ic;
};
void POLYGON::Rotate(axis ax, REAL fi) {
switch(ax) {
case X: {
m.Roll(fi);
m.Multiply(nVerts,&Vertecies[0],&Vertecies[0]);
}; break;
case Y: {
m.Pitch(fi);
m.Multiply(nVerts,&Vertecies[0],&Vertecies[0]);
}; break;
case Z: {
m.Yaw(fi);
m.Multiply(nVerts,&Vertecies[0],&Vertecies[0]);
};
};
m.Identity();
CalculateMidZ();
};
REAL POLYGON::GetMidZ() {
return MidZ;
};
void POLYGON::ZoomIN(int dz) {
for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(0,0,-dz,1);
};
void POLYGON::ZoomOUT(int dz) {
for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(0,0,dz,1);
};
void POLYGON::MoveY(int dy,int mode) {
if (mode)
for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(0,dy,0,1);
else for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(0,-dy,0,1);
};
void POLYGON::MoveX(int dx,int mode) {
if (mode)
for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(dx,0,0,1);
else for (int i=0; i<nVerts; i++) Vertecies[i].SetOffset(-dx,0,0,1);
};