/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================

	NOM DU FICHIER :CVector3f.cpp

	DESCRIPTION :	Implémentation de la classe vecteur

	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse

	DATE DE CRÉATION : 2004-3-16

	MISES À JOUR :

===============================================================================*/
#include "CVector3f.h"


/*------------------------------------------------------------------
  Fonction :	CVector3f::CVector3f

  Description :	Constructeur

  Paramètres :
	 float XX : Position en x à attribuer
	 float YY : Position en y à attribuer
	 float ZZ : Position en z à attribuer

  Valeur retournée :	Aucune (constructeur) : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f::CVector3f(float XX, float YY, float ZZ)
{
    this->PosX = XX;
    this->PosY = YY;
    this->PosZ = ZZ;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::setX

  Description :	Attribuer une valeur à la position en x

  Paramètres :
	 float xx : Valeur à attribuer

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CVector3f::setX(float xx)
{
	this->PosX = xx;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::setY

  Description :	Attribuer une valeur à la position en y

  Paramètres :
	 float yy : Valeur à attribuer

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CVector3f::setY(float yy)
{
	this->PosY = yy;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::setZ

  Description :	Attribuer une valeur à la position en z

  Paramètres :
	 float zz : Valeur à attribuer

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CVector3f::setZ(float zz)
{
	this->PosZ = zz;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::GetPosX

  Description :	Retourne la valeur en x

  Paramètres :

  Valeur retournée :	float : Valeur en x

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::GetPosX() const
{
	return PosX;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::GetPosY

  Description :	Retourne la valeur en y

  Paramètres :

  Valeur retournée :	float : Valeur en y

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::GetPosY() const
{
	return PosY;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::GetPosZ

  Description :	Retourne la valeur en z

  Paramètres :

  Valeur retournée :	float : Valeur en z

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::GetPosZ() const
{
	return PosZ;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::operator+

  Description :	Additionner deux vecteurs

  Paramètres :
	 const CVector3f& Vecteur : Vecteur à additionner

  Valeur retournée :	CVector3f : Vecteur additionné

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator+(const CVector3f& Vecteur) const
{
	CVector3f Tmp;
	Tmp.PosX = this->PosX + Vecteur.PosX;
	Tmp.PosY = this->PosY + Vecteur.PosY;
	Tmp.PosZ = this->PosZ + Vecteur.PosZ;
	return Tmp;
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::operator-

  Description :	Soustraire deux vecteurs

  Paramètres :
	 const CVector3f& Vecteur : Vecteur à soustraire

  Valeur retournée :	CVector3f : Vecteur soustrait

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator-(const CVector3f& Vecteur) const
{
	CVector3f Tmp;
	Tmp.PosX = this->PosX - Vecteur.PosX;
	Tmp.PosY = this->PosY - Vecteur.PosY;
	Tmp.PosZ = this->PosZ - Vecteur.PosZ;
	return Tmp;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator/

  Description :	Diviser un vecteur par un coefficient

  Paramètres :
	 const float UnFloat : Coefficient qui divise

  Valeur retournée :	CVector3f : Vecteur divisé

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator/(const float UnFloat) const
{
	CVector3f Tmp;
	Tmp.PosX = this->PosX/UnFloat;
	Tmp.PosY = this->PosY/UnFloat;
	Tmp.PosZ = this->PosZ/UnFloat;
	return Tmp;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator*

  Description :	Produit scalaire entre deux vecteurs

  Paramètres :
	 const CVector3f& Vecteur : Vecteur à multiplier

  Valeur retournée :	float : Produit scalaire

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::operator*(const CVector3f& Vecteur) const
{
	return PosX * Vecteur.PosX + PosY * Vecteur.PosY + PosZ * Vecteur.PosZ;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator*

  Description :	Multiplier un vecteur par un coefficient

  Paramètres :
	 const float UnFloat : Coefficient qui multiplie

  Valeur retournée :	CVector3f : Vecteur multiplié

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator*(const float UnFloat) const
{
	CVector3f Tmp;
	Tmp.PosX = this->PosX*UnFloat;
	Tmp.PosY = this->PosY*UnFloat;
	Tmp.PosZ = this->PosZ*UnFloat;
	return Tmp;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator>>

  Description :	Fonction pour faire une projection d'un vecteur sur un autre

  Paramètres :
	 const CVector3f& Vecteur : Vecteur sur lequel projeter

  Valeur retournée :	CVector3f : Vecteur projeté

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator>>(const CVector3f& Vecteur) const
{
	return ((*this * Vecteur) / (Vecteur * Vecteur)) * Vecteur;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator-

  Description :	Inverser le vecteur

  Paramètres :

  Valeur retournée :	CVector3f : Vecteur inversé

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::operator-() const
{
	CVector3f Tmp;
	Tmp.PosX = -this->PosX;
	Tmp.PosY = -this->PosY;
	Tmp.PosZ = -this->PosZ;
	return Tmp;
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::operator==

  Description :	Vérifie si deux vecteurs sont égaux

  Paramètres :
	 const CVector3f& Vecteur : 

  Valeur retournée :	bool : Retourne s'ils sont égaux ou pas

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool CVector3f::operator==(const CVector3f& Vecteur) const
{
	return (this->PosX == Vecteur.PosX && this->PosY == Vecteur.PosY && this->PosZ == Vecteur.PosZ);
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::GetNorm

  Description :	Retourne la norme du vecteur

  Paramètres :

  Valeur retournée :	float : Norme

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::GetNorm() const
{
	return sqrt(PosX*PosX + PosY*PosY + PosZ*PosZ);
}


/*------------------------------------------------------------------
  Fonction :	CVector3f::GetNormalVector

  Description :	Normalise un vecteur

  Paramètres :

  Valeur retournée :	CVector3f : Vecteur normalisé

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CVector3f::GetNormalVector() const
{
	return ((*this)/GetNorm());
}

/*------------------------------------------------------------------
  Fonction :	CVector3f::SideProduct

  Description :	Produit vectoriel des composantes en x et y seulement

  Paramètres :
	 const CVector3f Vecteur : 

  Valeur retournée :	float : Valeur en z du produit vectoriel

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
float CVector3f::SideProduct(const CVector3f Vecteur) const
{
	return (PosX * Vecteur.PosY - PosY * Vecteur.PosX);
}

CVector3f CVector3f::SideProductV(const CVector3f Vecteur) const
{
    CVector3f Tmp;
    Tmp.setX(PosY * Vecteur.PosZ - PosZ * Vecteur.PosY);
    Tmp.setY(-(PosX * Vecteur.PosZ - PosZ * Vecteur.PosX));
    Tmp.setZ(PosX * Vecteur.PosY - PosY * Vecteur.PosX);
    return Tmp;
}

CVector3f operator*(const float UnFloat, const CVector3f Vecteur)
{
	return CVector3f(UnFloat*Vecteur.GetPosX(),UnFloat*Vecteur.GetPosY(),UnFloat*Vecteur.GetPosZ());
}



/*------------------------------------------------------------------
  Fonction :	<< 

  Description :	Fonction qui affiche le vecteur à l'écran

  Paramètres :
	 std::ostream& o : 
	 const CVector3f& v : 

  Valeur retournée :	std::ostream& operator : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
std::ostream& operator << (std::ostream& o, const CVector3f& v)
{
	o << "(" << v.GetPosX() << ", " << v.GetPosY() << ", " << v.GetPosZ() << ")\n";
	return o;
}
