#ifndef _vector_h_ #define _vector_h_ #include "../Object/point.h" #include "../Object/rectangle.h" class CScale; class CVector { public: void Update (void); // mise à jour des variables membres lorsque l'un des points // du vecteur est modifie Point m_pt1, // premier point du vecteur (pour l'orientation) m_pt2; // deuxieme point du vecteur long m_dwSize; // nombre de points requis pour tracer une droite continue CVector(void); CVector(const Point &, const Point &); CVector(int, int, int, int); inline CVector(const CVector &vSource) { *this = vSource; }; Point operator [] (long) const; const CVector &operator = (const CVector & ); inline long operator * (const CVector &v) const { return (v.m_lDeltaX * m_lDeltaX) + (v.m_lDeltaY * m_lDeltaY); } inline long Length(void) const { return (m_dwSize); };// = max(dx, dy) = (dx^n+dy^n)^(1/n) avec n=infini (distance euclidienne n=2, distance de manhatan n=1) [JAK - 21/1/2003] inline bool Nul(void) const { return (m_dwSize == 0); }; inline const Point& StartPoint(void) const { return (m_pt1); }; inline const Point& EndPoint(void) const { return (m_pt2); }; inline void SetStartPoint(const Point &pt) { m_pt1 = pt; Update (); }; inline void SetEndPoint(const Point &pt) { m_pt2 = pt; Update (); }; inline void OffsetVector(long x, long y) { m_pt1.Offset (x, y); m_pt2.Offset (x, y); } inline double Norm(void) const { return (m_dblNorm); }; double Norm(const CScale*) const; bool PointInVector(const Point &) const; bool PointOnLine(const Point &) const; double Angle(const Point &) const; CVector Orthogonal(const Point &, const Point &) const; // vecteur orthogonal partant du 1er point vers le 2eme point CVector Orthogonal(const Point &, unsigned int) const; // vecteur orthogonal partant du point dans le sens donne // vecteur orthogonal par le projete orthogonal du point sur le vecteur inline CVector Orthogonal (const Point &pt) const { return CVector(Projected(pt), pt); } Point Projected(const Point &) const; // projete orthogonal du point sur le vecteur void SetLength(long); void Mask(const Rect &); long PosFromPoint(const Point &) const; // retourne la position ESTIMEE d'un point sur // la droite. Cela ne veut pas dire qu'il // fait partie de la droite void MoveTo(const Point &ptNewStart); // Deplace bool m_fHorizontal; // variations horizontale/verticale la moins importante protected: long m_lDeltaX; // variation en abscisse long m_lDeltaY; // variation en ordonnee double m_dblNorm; // norme du vecteur en pixels }; #endif