/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================
  
	NOM DU FICHIER :vector2f.cpp
	
	DESCRIPTION :	Fichier contenant l'implémentation de la classe vector2f, un vecteur 2D
	
	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
	
	DATE DE CRÉATION : 2004-3-17
	
	MISES À JOUR :
	
===============================================================================*/

#include <cmath>
#include "vector2f.h"

// Constructeur
vector2f::vector2f(float PosX, float PosY)
{
    this->PosX = PosX;
    this->PosY = PosY;
}

// Opérateur d'addtion
vector2f vector2f::operator+(const vector2f& Vecteur) const
{
    vector2f Tmp;
    Tmp.PosX = this->PosX + Vecteur.PosX;
    Tmp.PosY = this->PosY + Vecteur.PosY;
    return Tmp;
}

// Opérateur de soustraction
vector2f vector2f::operator-(const vector2f& Vecteur) const
{
    vector2f Tmp;
    Tmp.PosX = this->PosX - Vecteur.PosX;
    Tmp.PosY = this->PosY - Vecteur.PosY;
    return Tmp;
}

// Opérateur de division par un scalaire
vector2f vector2f::operator/(const float UnFloat) const
{
    vector2f Tmp;
    Tmp.PosX = this->PosX/UnFloat;
    Tmp.PosY = this->PosY/UnFloat;
    return Tmp;
}

// Opérateur de multiplication par un scalaire
vector2f vector2f::operator*(const float UnFloat) const
{
    vector2f Tmp;
    Tmp.PosX = this->PosX*UnFloat;
    Tmp.PosY = this->PosY*UnFloat;
    return Tmp;
}

// Opérateur unaire - ( => * -1)
vector2f vector2f::operator-() const
{
    vector2f Tmp;
    Tmp.PosX = -this->PosX;
    Tmp.PosY = -this->PosY;
    return Tmp;
}

// Opérateur d'égalité entre 2 vecteurs
bool vector2f::operator==(const vector2f& Vecteur) const
{
    return (this->PosX == Vecteur.PosX && this->PosY == Vecteur.PosY);
}

// Fonction qui retourne la norme du vecteur
float vector2f::GetNorm() const
{
    return sqrt(PosX*PosX + PosY*PosY);
}

// Fonction qui retourne un vecteur normal dans la direction du vecteur
vector2f vector2f::GetNormalVector() const
{
    return ((*this)/GetNorm());
}

//Ce produit retourne une valeur positive ou négative
//  selon le côté du deuxième vecteur par rapport au premier
//  (comme un produit vectoriel)
float vector2f::SideProduct(const vector2f Vecteur) const
{
    return (PosX * Vecteur.PosY - PosY * Vecteur.PosX);
}

// Opérateur de produit d'un scalaire et d'un vecteur
vector2f operator*(const float UnFloat, const vector2f Vecteur)
{
    return vector2f(UnFloat*Vecteur.GetPosX(),UnFloat*Vecteur.GetPosY());
}
