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

Vecteur::Vecteur() : m_x(0.0), m_y(0.0), m_z(0.0)
{

}
Vecteur::Vecteur(float x, float y, float z) : m_x(x), m_y(y), m_z(z)
{

}
Vecteur::Vecteur(const Vecteur &vecteur) : m_x(vecteur.getX()), m_y(vecteur.getY()), m_z(vecteur.getZ())
{

}
Vecteur::~Vecteur()
{

}
float Vecteur::getX() const
{
    return m_x;
}

float Vecteur::getY() const
{
    return m_y;
}

float Vecteur::getZ() const
{
    return m_z;
}


// Setters

void Vecteur::setVecteur(float x, float y, float z)
{
    m_x = x;
    m_y = y;
    m_z = z;
}

void Vecteur::setX(float x)
{
    m_x = x;
}

void Vecteur::setY(float y)
{
    m_y = y;
}

void Vecteur::setZ(float z)
{
    m_z = z;
}
void Vecteur::normaliser()
{
    // La fonction sqrt() permet de trouver la racine carrÃ© d'un nombre

    float longueur (sqrt(m_x * m_x + m_y * m_y + m_z * m_z));


    // Normalisation du vecteur

    if(longueur != 0.0)
    {
        m_x /= longueur;
        m_y /= longueur;
        m_z /= longueur;
    }
}
Vecteur& Vecteur::operator=(const Vecteur &vecteur)
{
    // Copie des valeurs

    m_x = vecteur.m_x;
    m_y = vecteur.m_y;
    m_z = vecteur.m_z;


    // Retour de l'objet

    return *this;
}
Vecteur Vecteur::operator+(const Vecteur &vecteur)
{
    // Création d'un objet résultat

    Vecteur resultat;


    // Addition des coordonnées

    resultat.m_x = m_x + vecteur.m_x;
    resultat.m_y = m_y + vecteur.m_y;
    resultat.m_z = m_z + vecteur.m_z;


    // Retour de résultat

    return resultat;
}
Vecteur Vecteur::operator-(const Vecteur &vecteur)
{
    // Création d'un objet résultat

    Vecteur resultat;


    // Soustraction des coordonnées

    resultat.m_x = m_x - vecteur.m_x;
    resultat.m_y = m_y - vecteur.m_y;
    resultat.m_z = m_z - vecteur.m_z;


    // Retour de résultat

    return resultat;
}
Vecteur Vecteur::operator*(float multiplicateur)
{
    // Création d'un objet résultat

    Vecteur resultat;


    // Multiplication des coordonnées

    resultat.m_x = m_x * multiplicateur;
    resultat.m_y = m_y * multiplicateur;
    resultat.m_z = m_z * multiplicateur;


    // Retour du résultat

    return resultat;
}
Vecteur Vecteur::operator/(float diviseur)
{
    // Création d'un objet résultat

    Vecteur resultat;


    // Multiplication des coordonnées

    resultat.m_x = m_x / diviseur;
    resultat.m_y = m_y / diviseur;
    resultat.m_z = m_z / diviseur;


    // Retour du résultat

    return resultat;
}
Vecteur Vecteur::operator*(const Vecteur &vecteur)
{
    // Création d'un objet résultat

    Vecteur resultat;


    // Produit Vectoriel

    resultat.m_x = (m_y * vecteur.m_z) - (m_z * vecteur.m_y);
    resultat.m_y = (m_z * vecteur.m_x) - (m_x * vecteur.m_z);
    resultat.m_z = (m_x * vecteur.m_y) - (m_y * vecteur.m_x);


    // Retour de l'objet

    return resultat;
}
void Vecteur::operator*=(const Vecteur &vecteur)
{
    *this = *this * vecteur;
}
void Vecteur::operator-=(const Vecteur &vecteur)
{
    *this = *this - vecteur;
}
void Vecteur::operator+=(const Vecteur &vecteur)
{
    *this = *this + vecteur;
}
void Vecteur::operator*=(float multiplicateur)
{
    *this = *this * multiplicateur;
}
void Vecteur::operator/=(float multiplicateur)
{
    *this = *this * multiplicateur;
}
float Vecteur::scalair(const Vecteur &vecteur)
{
    Vecteur v1(*this), v2(vecteur);
    v1.normaliser();
    v2.normaliser();
    return v1.getX() * v2.getX() + v1.getY() * v2.getY() + v1.getZ() * v2.getZ();
}
bool Vecteur::operator==(const Vecteur &vecteur)
{
    if(m_x == vecteur.getX() && m_y == vecteur.getY() && m_z == vecteur.getZ())
        return true;
    else
        return false;
}
bool Vecteur::operator!=(const Vecteur &vecteur)
{
    if(*this == vecteur)
        return false;
    else
        return true;
}
double Vecteur::norme()
{
    return sqrt(m_x*m_x+m_y*m_y+m_z*m_z);
}
void Vecteur::rotateR(float angle)
{
    float tmp = m_x;
    m_x = cos(angle)*m_x-sin(angle)*m_y;
    m_y = sin(angle)*tmp+cos(angle)*m_y;
}
void Vecteur::rotateD(float angle)
{
    float _angle = angle*M_PI/180;
    float tmp = m_x;
    m_x = cos(_angle)*m_x-sin(_angle)*m_y;
    m_y = sin(_angle)*tmp+cos(_angle)*m_y;
}
