#ifndef POINT2D_H
#define POINT2D_H

#include <string>
#include "Converter.h"
#include "MemoryManager/debugNew.h"
/**
 * clase definissant un point en 2D.
 *
 * Cette classe permet de gerer un simple point en 2D avec des coordonée X et Y.
 */
class Point2D
{
private:
protected:
	/**
	 * coordonnée X du point
	 */
	float x;
	/**
	 * coordonnée y du point
	 */
	float y;
public:
	/**
	 * constructeur par defaut.
	 *
	 * initialise X et Y à 0
	 */
	Point2D(void);
	/**
	 * constructeur initialisant le point au coordonnée passée en parametres.
	 * @param x : la valeure de X
	 * @param y : la valeure de Y
	 */ 
	Point2D(float x, float y);
	/**
	 * constructeur initialisant le point au coordonnée passée en parametres.
	 * @param x : la valeure de X
	 * @param y : la valeure de Y
	 */ 
	Point2D(int x, int y);

	/**
	 * destructeur par defaut
	 */
	~Point2D();
	/**
	 * methode permettant de recuperer la valeure de X du point.
	 * @retun float : la valeure de X
	 */
	float getX()const;
	/**
	 * methode permettant de definire la coordonnée X du point
	 * @param x : la coordonnée X du point.
	 */
	void setX(float x);
	/**
	 * methode permettant de recuperer la coordonnée Y du point.
	 * @return float : le coordonnée Y du point.
	 */
	float getY()const;
	/**
	 * methode permettant de definir la coordonnée Y du point.
	 * @param y  : la coordonnée Y du point.
	 */
	void setY(float y);
	/**
	 * methode permettant de definir la coordonnée du point.
	 * @param x : la coordonnée X du point.
	 * @param y : la coordonnée Y du point.
	 */
	void setCoord(float x,float y);
	/**
	 * methode permettant de definir la coordonnée du point.
	 * @param x : la coordonnée X du point.
	 * @param y : la coordonnée Y du point.
	 */
	void setCoord(int x,int y);

	/**
	 * redefinition de l'operateur d'egalitée pour tester si 2 points sont egaux.
	 * @param p : le point à tester.
	 * @return bool : true si les 2 points sont egaux, false sinon.
	 */
	bool operator==(const Point2D& p)const;

	/**
	 * redefinition de l'operateur + pour additionner les coordonnée de 2 Point2D
	 * @param p : le point à additionner au point courant
	 * @return Point2D : le resultat de l'addition
	 */
	Point2D operator+(const Point2D& p)const;

	/**
	 * redefinition de l'operateur - pour soustraire les coordonnée de 2 Point2D
	 * @param p : le point à soustraire au point courant
	 * @return Point2D : le resultat de l'addition
	 */
	Point2D operator-(const Point2D& p)const;

	/**
	 * redefinition de l'operateur * pour multiplier les coordonnée du Point2D par un facteur
	 * @param factor : le facteur de mulitplication des coordonnée du point2D
	 * @return Point2D : le resultat de la muliplication
	 */ 
	Point2D operator*(const float factor)const;

	/** 
	 * redefinition de l'operateur d'addition assignement
	 * @param p : le point à additionner au point courant
	 * @return Point2D :reference sur le Point2D courant modifié
	 */
	Point2D& operator+=(const Point2D& p);

	/** 
	 * redefinition de l'operateur de multiplication assignement
	 * @param l factor : le facteur de multiplication des coordonnée
	 * @return Point2D :reference sur le Point2D courant modifié
	 */
	Point2D& operator*=(const float factor);

	/**
	 * methode permettant de recuperer la longueur du veteur.
	 * @return float : la longueur du vecteur
	 */
	float getLength()const;

	/**
	 * methode permettant de normaliser le vecteur.
	 */
	void normalise();

	/**
	 * methode permettant de tester l'egalitée entre 2 Point2D
	 * @param p : le point à tester.
	 * @return bool : true si les 2 points sont egaux, false sinon.
	 */
	bool equals(const Point2D& p)const;

	/**
	 * methode permettant de recuperer l'angle entre le point courant et le point passé en parametre.
	 * @param destination : le point de destination
	 * @return float : l'angle entre les 2 point en degré.
	 */
	float getAngle(const Point2D& destination);

	std::string toString(void);

};

#include "MemoryManager/debugNewOff.h"


#endif
