Newer
Older
cg / sources / poly.cpp
@ajaggi ajaggi on 28 Dec 2005 2 KB Moved classes to their own files.
#include <stdio.h>
#include <math.h>

#include <GL/gl.h>
#include <GL/glu.h>

#include "poly.h"

Poly::Poly(Array* _points) {
	Poly(_points, Color(1,1,1));
}

Poly::Poly(Array* _points, Color _color) {
	size = _points->length();
	position = new Vec(0,0,0);
	rotation = new Vec(0,0,0);
	color = _color.clone();

#ifdef DEBUG
	printf("new Poly(%d)\n", size);
#endif
	initpoints = new Array(_points);

	setCenter(calcCenter());
}

Poly::~Poly() {
	delete position;
	delete rotation;
	delete color;
	delete initpoints;
}

/*
* set the position where the (rotation-)center of
* the polygon is located
*/
void Poly::setCenter(Vec c) {
	delete position;
	position = c.clone();
}

/*
* initial rotation relative to rotation center
*/
Vec Poly::getInitRotation(Vec& v) {
	return Vec(atan2(v.y(), v.z()), atan2(v.x(), v.z()), atan2(v.y(), v.x()));
}

/*
* calculate the center relative to all vertices.
*/
Vec Poly::calcCenter() {
	Vec s (0,0,0);
	Vec* t;
	initpoints->reset();
	while ( t = (Vec*)initpoints->next() ) {
		s = s+*t;
	}
	return s / ((float)size);
}

/*
* reset the position of all vertices (ie. translate your
* polygon to an absolute position)
*/
void Poly::setPosition(Vec newcenter) {
	Vec diff = newcenter - (*position);
	delete position;
	position = newcenter.clone();
	Vec* t;
	initpoints->reset();
	while ( t = (Vec*)initpoints->next() ) {
		t->add(diff);
	}
}

//additional rotation in arcs
void Poly::rotate(Vec rot) {
	rotation->add(rot);
}

Vec Poly::rotate_x(Vec& c) {
	Vec initrot = getInitRotation(c);
	Vec rot = initrot + *rotation;
	float r = Vec(0, c.y(), c.z()).length();
	return Vec (c.x(), r*cos(rot.x()), r*sin(rot.x()));
}

Vec Poly::rotate_y(Vec& c) {
	Vec initrot = getInitRotation(c);
	Vec rot = initrot + *rotation;
	float r = Vec(c.x(), 0, c.z()).length();
	return Vec (r*sin(rot.y()), c.y(), r*cos(rot.y()));
}

Vec Poly::rotate_z(Vec& c) {
	Vec initrot = getInitRotation(c);
	Vec rot = initrot + *rotation;
	float r = Vec(c.x(), c.y(), 0).length();
	return Vec (r*cos(rot.z()), r*sin(rot.z()), c.z());
}

void Poly::draw() {
	glBegin (GL_POLYGON);

	//Vec v1 = *((Vec*)initpoints->get(2)) - *((Vec*)initpoints->get(0));
	//Vec v2 = *((Vec*)initpoints->get(1)) - *((Vec*)initpoints->get(0));
	//glNormal3fv(  v1.cross(v2)+ *(Vec*)((*initpoints)[0]).c  );
	//glNormal3fv(  v1.cross(v2) + ((Vec*)initpoints->get(0))->c  );

	Vec* t;
	Vec* mv;
	initpoints->reset();
	while ( (t = (Vec*)initpoints->next()) ) {
		color->drawColor();
		Vec out = (*t - *position);
		out = rotate_x(out);
		out = rotate_y(out);
		out = rotate_z(out);
		mv = (*position + out).clone();
		glVertex3fv(mv->c);
	}
	glEnd();
}