#include "dibujo.h"




Punto::Punto(float xx, float yy, float zz, float ww)
//Constructor por defecto
{
	x=xx; y=yy; z=zz; w=ww; esUnitario=0;
}

Punto Punto::comoVector()
//Devuelve el punto como vector
{
	return (Punto(x,y,z,0.0));
}

float Punto::modulo()
//Devuelve el modulo del vector
{
	return ((float)sqrt((double)x*x+y*y+z*z));
}

float Punto::longitud()
//Calcula la longitud (0..360º) esferica del vector en grados
{
	float lon;
	if(x+z==0.0) return 0.0;
	lon= (float)acos(z/sqrt(x*x+z*z));		
	if(x<0) lon= (float)(2*PI-lon);
	return (float)RAD2DEG(lon);
}

float Punto::latitud()
//Calcula la latitud (-90º..90º) esférica del vector en grados
{
	float lat;
	lat= (float)acos(sqrt(x*x+z*z)/modulo());		
	if(y<0) lat= -lat;
	return (float)RAD2DEG(lat);
}








Flecha::Flecha(void)
{
	color=Color(1.0f,0.0f,0.0f);
	vector=Punto(1.0f,0.0f,0.0f,0.0f);
}

Flecha::Flecha(Punto dir, Color col)
{
	color=col;
	vector=dir.comoVector();
}

Flecha::~Flecha(void)
{
}

void Flecha::dibujar(void)
{
	dibujar(Punto());
}

void Flecha::dibujar(const Punto n)
{
	//Se asume que la fecha está ya transformada?
	float largo= vector.modulo();
	glColor3f(color.r,color.g,color.b);
	if(largo<0.001){ //Es muy pequeño o nulo; lo dibujamos como un punto
		glPointSize(4.0);
		glBegin(GL_POINTS);
			glVertex3d(n.x+vector.x,n.y+vector.y,n.z+vector.z);
		glEnd();
	}
	else { //Si es más grande como un flecha
		glBegin(GL_LINES);
			glVertex3d(n.x,n.y,n.z);
			glVertex3d(n.x+vector.x,n.y+vector.y,n.z+vector.z);
		glEnd();
		glPushMatrix();
		glTranslatef(n.x+vector.x,n.y+vector.y,n.z+vector.z);
		glRotatef(vector.longitud(),0.0,1.0,0.0);
		glRotatef(-vector.latitud(),1.0,0.0,0.0);
		glTranslatef(0.0,0.0,-largo/10.0);
		glutWireCone(largo/50.0,largo/10.0,10,1);
		glPopMatrix();
	};
}


