Main Page | Class Hierarchy | Class List | Directories | File List

Vec3.h

00001 #ifndef __VEC3__
00002 #define __VEC3__
00003 
00004 #include "Vec2.h"
00005 #include <QString>
00006 #include <QDomElement>
00007 #include <QDomDocument>
00008 
00009 namespace apig {
00010     class Vec4;
00011 
00013     class Vec3 {
00014         public:
00015             Vec3(float x, float y, float z);
00016             Vec3(float c = 0);  // vecteur (c,c,c)
00017             Vec3(Vec2 v, float z = 0);
00018             Vec3(float x, Vec2 yz);
00019             Vec3(const float *v);   // tableau de 3 valeurs
00020             Vec3(Vec4 vec);         // fait la division par la 4ème composante avant d'affecter les composantes (x,y,z)
00021             Vec3(const QDomElement &element);
00022             
00023         // opérateurs de conversion :
00024         //---------------------------
00025             // opérateurs de conversion automatique :
00026             inline operator const float* () const { return v; }     // cast en const float*
00027             inline operator       float* ()       { return v; }     // cast en float*
00028             // autres conversions :
00029             QString toQString() const;
00030             Vec4    toVec4()    const;
00031             // lecture / écriture d'un élément XML :
00032             void initFromDOMElement(const QDomElement &element);
00033             QDomElement domElement(const QString &name, QDomDocument &document) const;
00034     
00035         // opérations géométriques :
00036         //--------------------------
00037             float norm() const;         // norme
00038             float norm2() const;        // norme au carré
00039             void  normalize();          // normalise le vecteur
00040             Vec3  normalized() const;   // retourne le vecteur normalisé
00041     
00042             friend Vec3  vec(const Vec3 &a, const Vec3 &b);    // produit vectoriel
00043             friend float dot(const Vec3 &a, const Vec3 &b);    // produit scalaire
00044             friend Vec3  operator^(const Vec3 &a, const Vec3 &b) { return vec(a,b); }
00045             friend float operator|(const Vec3 &a, const Vec3 &b) { return dot(a,b); }
00046             
00047             friend float dist(Vec3 v1, Vec3 v2);    // distance euclidienne
00048             friend Vec3 triangleNormal(const Vec3 &a, const Vec3 &b, const Vec3 &c);    // normale du triangle (a,b,c), dans le sens trigo
00049     
00050             Vec3 ortho() const;     // retourne un vecteur orthogonal à celui-ci
00051     
00052         // opérateurs arithmétiques :
00053         //---------------------------
00054             // opérateurs arithmétiques unaires :
00055             friend Vec3 operator-(const Vec3 &a);
00056     
00057             // opérateurs arithmétiques binaires :
00058             friend Vec3 operator+(const Vec3 &a, const Vec3 &b);
00059             friend Vec3 operator-(const Vec3 &a, const Vec3 &b);
00060             friend Vec3 operator*(const Vec3 &a, const Vec3 &b);
00061             friend Vec3 operator/(const Vec3 &a, const Vec3 &b);
00062                 
00063             // opérations avec un scalaire :
00064             friend Vec3 operator*(float s, const Vec3 &a);
00065             friend Vec3 operator*(const Vec3 &a, float s);
00066             friend Vec3 operator/(float s, const Vec3 &a);
00067             friend Vec3 operator/(const Vec3 &a, float s);
00068             
00069             // opérateurs de modification :
00070             Vec3& operator+=(const Vec3 &a);
00071             Vec3& operator-=(const Vec3 &a);
00072             Vec3& operator*=(const Vec3 &a);
00073             Vec3& operator/=(const Vec3 &a);
00074             Vec3& operator*=(float s);
00075             Vec3& operator/=(float s);
00076         
00077         // opérateurs de comparaison :
00078         //----------------------------
00079             friend bool operator==(const Vec3 &a, const Vec3 &b);   // comparaison à 1e-10 près
00080             friend bool operator!=(const Vec3 &a, const Vec3 &b);   // comparaison à 1e-10 près
00081             // les comparaisons suivantes sont le <et> booléen des comparaisons sur les composantes :
00082             friend bool operator>=(const Vec3 &a, const Vec3 &b);
00083             friend bool operator<=(const Vec3 &a, const Vec3 &b);
00084             friend bool operator>(const Vec3 &a, const Vec3 &b);
00085             friend bool operator<(const Vec3 &a, const Vec3 &b);
00086             friend bool operator>=(const Vec3 &a, float b);
00087             friend bool operator<=(const Vec3 &a, float b);
00088             friend bool operator>(const Vec3 &a, float b);
00089             friend bool operator<(const Vec3 &a, float b);
00090         
00091         // autres fonctions pratiques :
00092         //-----------------------------
00093             friend Vec3 abs(const Vec3 &a);
00094             friend Vec3 sign(const Vec3 &a);
00095             friend Vec3 floor(const Vec3 &a);
00096             friend Vec3 ceil(const Vec3 &a);
00097             friend Vec3 fract(const Vec3 &a);
00098             friend Vec3 min(const Vec3 &a, const Vec3 &b);
00099             friend Vec3 min(const Vec3 &a, float b);
00100             friend Vec3 max(const Vec3 &a, const Vec3 &b);
00101             friend Vec3 max(const Vec3 &a, float b);
00102             friend Vec3 clamp(const Vec3 &a, const Vec3 &min, const Vec3 &max);
00103             friend Vec3 clamp(const Vec3 &a, float min, float max);
00104             friend Vec3 mix(const Vec3 &a, const Vec3 &b, const Vec3 &alpha);     // (1-alpha) * a + alpha * b
00105             friend Vec3 mix(const Vec3 &a, const Vec3 &b, float alpha);           // (1-alpha) * a + alpha * b
00106             friend Vec3 step(const Vec3 &e, const Vec3 &a);
00107             friend Vec3 step(float e, const Vec3 &a);
00108             friend float min(const Vec3 &a);    // minimum des composantes
00109             friend float max(const Vec3 &a);    // maximum des composantes
00110         
00111         // opérateurs de swizzle :
00112         //------------------------
00113             Vec2 xx() const { return Vec2(x,x); }
00114             Vec2 xy() const { return Vec2(x,y); }
00115             Vec2 xz() const { return Vec2(x,z); }
00116             Vec2 yx() const { return Vec2(y,x); }
00117             Vec2 yy() const { return Vec2(y,y); }
00118             Vec2 yz() const { return Vec2(y,z); }
00119             Vec2 zx() const { return Vec2(z,x); }
00120             Vec2 zy() const { return Vec2(z,y); }
00121             Vec2 zz() const { return Vec2(z,z); }
00122         
00123             Vec3 yzx() const { return Vec3(y,z,x); }
00124             Vec3 zxy() const { return Vec3(z,x,y); }
00125             
00126         // calcul de vecteurs aléatoires (variables uniformes) :
00127         //------------------------------------------------------
00128             static Vec3 random();                       // valeurs dans [0,1[
00129             static Vec3 random(float min, float max);   // valeurs dans [min,max[
00130             static Vec3 random(Vec3 min, Vec3 max);     // bornes par composantes
00131             static Vec3 randomDir();                    // retourne un point aléatoire de la sphère unité
00132         
00133     
00134         // opérations OpenGL :
00135         //--------------------
00136             void glVertex() const;    // effectue le glVertex correspondant
00137             void glNormal() const;    // effectue le glNormal correspondant
00138             
00139         public:
00140             union {
00141                 struct { float x, y, z; };
00142                 float v[3];
00143                 };
00144         };
00145     
00146     }
00147 
00148 #endif
00149 

Generated on Fri Nov 14 20:49:47 2008 for Api Graphics by  doxygen 1.4.4