#ifndef INC_ALGEBRE_H #define INC_ALGEBRE_H #include #include #include #include #define Point3d Vecteur3d class Vecteur3d : public std::vector { void init(); public: Vecteur3d() {init();} Vecteur3d(const Point3d &p1,const Point3d &p2); Vecteur3d(float x, float y, float z,bool normalise=false); GLfloat *fv() const; GLfloat x() const {return (*this)[0];} GLfloat y() const {return (*this)[1];} GLfloat z() const {return (*this)[2];} void set(float x,float y, float z,bool normalise=false); double norme(); void print(); Vecteur3d operator -() {return Vecteur3d(-x(),-y(),-z());} friend Vecteur3d operator +(const Vecteur3d &v1,const Vecteur3d &v2); Vecteur3d rotation(float angle); void normaliser(); void scale(float kx,float ky,float kz); void scale(float k); void translate(float x, float y, float z); friend Vecteur3d scale(const Vecteur3d &v,float k); }; class Vertex { Point3d p; Vecteur3d n; int nb_normal; // calcul des normales au sommet void init(); public: Vertex() {init();} void setNormal(float x,float y,float z); void setNormal(Vecteur3d nn) {n=nn;} void setPoint(Point3d pp) {p=pp;} void setPoint(float x,float y,float z); const Vecteur3d &normal() {return n;} const Point3d &point() {return p;} void addNormal(const Vecteur3d &n); void addNormalBegin(); void addNormalEnd(); void scale(float k) {p.scale(k);} void translate(float x,float y,float z) {p.translate(x,y,z);} }; class AVecteur3d : public std::vector { public: void clean(); }; typedef AVecteur3d::const_iterator ItVecteur3d; float prodScal(const Vecteur3d &v1,const Vecteur3d &v2); Vecteur3d prodVect(const Vecteur3d &v1,const Vecteur3d &v2); Vecteur3d moyenne(const Vecteur3d &n1,const Vecteur3d &n2); Vecteur3d normaleSegment(const Point3d &p1,const Point3d &p2); #endif