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

Лабы / 5 / ROMA / POLYGON

.CPP
Скачиваний:
20
Добавлен:
16.04.2013
Размер:
2.53 Кб
Скачать
#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);
};
Соседние файлы в папке ROMA