MeshKit
1.0
|
00001 #ifndef GFXMATH_VEC3_INCLUDED // -*- C++ -*- 00002 #define GFXMATH_VEC3_INCLUDED 00003 00004 /************************************************************************ 00005 00006 3D Vector class. 00007 00008 $Id: Vec3.h,v 1.6 1997/03/17 22:52:26 garland Exp $ 00009 00010 ************************************************************************/ 00011 00012 class Vec3 { 00013 private: 00014 double elt[3]; 00015 00016 protected: 00017 inline void copy(const Vec3& v); 00018 00019 public: 00020 // 00021 // Standard constructors 00022 // 00023 Vec3(double x=0, double y=0, double z=0) { elt[0]=x; elt[1]=y; elt[2]=z; } 00024 #ifdef GFXMATH_VEC2_INCLUDED 00025 Vec3(const Vec2& v, double z) { elt[0]=v[0]; elt[1]=v[1]; elt[2]=z; } 00026 #endif 00027 Vec3(const Vec3& v) { copy(v); } 00028 Vec3(const double *v) { elt[0]=v[0]; elt[1]=v[1]; elt[2]=v[2]; } 00029 00030 // 00031 // Access methods 00032 // 00033 #ifdef SAFETY 00034 double& operator()(int i) { assert(i>=0 && i<3); return elt[i]; } 00035 double operator()(int i) const { assert(i>=0 && i<3); return elt[i]; } 00036 #else 00037 double& operator()(int i) { return elt[i]; } 00038 double operator()(int i) const { return elt[i]; } 00039 #endif 00040 double& operator[](int i) { return elt[i]; } 00041 double operator[](int i) const { return elt[i]; } 00042 00043 double *raw() { return elt; } 00044 const double *raw() const { return elt; } 00045 00046 // 00047 // Comparison operators 00048 // 00049 inline bool operator==(const Vec3& v) const; 00050 inline bool operator!=(const Vec3& v) const; 00051 00052 // 00053 // Assignment and in-place arithmetic methods 00054 // 00055 inline void set(double x, double y, double z) { elt[0]=x; elt[1]=y; elt[2]=z; } 00056 inline Vec3& operator=(const Vec3& v); 00057 inline Vec3& operator+=(const Vec3& v); 00058 inline Vec3& operator-=(const Vec3& v); 00059 inline Vec3& operator*=(double s); 00060 inline Vec3& operator/=(double s); 00061 00062 // 00063 // Binary arithmetic methods 00064 // 00065 inline Vec3 operator+(const Vec3& v) const; 00066 inline Vec3 operator-(const Vec3& v) const; 00067 inline Vec3 operator-() const; 00068 00069 inline Vec3 operator*(double s) const; 00070 inline Vec3 operator/(double s) const; 00071 inline double operator*(const Vec3& v) const; 00072 inline Vec3 operator^(const Vec3& v) const; 00073 }; 00074 00075 00076 00078 // 00079 // Method definitions 00080 // 00081 00082 inline void Vec3::copy(const Vec3& v) 00083 { 00084 elt[0]=v.elt[0]; elt[1]=v.elt[1]; elt[2]=v.elt[2]; 00085 } 00086 00087 inline bool Vec3::operator==(const Vec3& v) const 00088 { 00089 double dx=elt[X]-v[X], dy=elt[Y]-v[Y], dz=elt[Z]-v[Z]; 00090 return (dx*dx + dy*dy + dz*dz) < FEQ_EPS2; 00091 } 00092 00093 inline bool Vec3::operator!=(const Vec3& v) const 00094 { 00095 double dx=elt[X]-v[X], dy=elt[Y]-v[Y], dz=elt[Z]-v[Z]; 00096 return (dx*dx + dy*dy + dz*dz) > FEQ_EPS2; 00097 } 00098 00099 inline Vec3& Vec3::operator=(const Vec3& v) 00100 { 00101 copy(v); 00102 return *this; 00103 } 00104 00105 inline Vec3& Vec3::operator+=(const Vec3& v) 00106 { 00107 elt[0] += v[0]; elt[1] += v[1]; elt[2] += v[2]; 00108 return *this; 00109 } 00110 00111 inline Vec3& Vec3::operator-=(const Vec3& v) 00112 { 00113 elt[0] -= v[0]; elt[1] -= v[1]; elt[2] -= v[2]; 00114 return *this; 00115 } 00116 00117 inline Vec3& Vec3::operator*=(double s) 00118 { 00119 elt[0] *= s; elt[1] *= s; elt[2] *= s; 00120 return *this; 00121 } 00122 00123 inline Vec3& Vec3::operator/=(double s) 00124 { 00125 elt[0] /= s; elt[1] /= s; elt[2] /= s; 00126 return *this; 00127 } 00128 00129 00130 inline Vec3 Vec3::operator+(const Vec3& v) const 00131 { 00132 return Vec3(elt[0]+v[0], elt[1]+v[1], elt[2]+v[2]); 00133 } 00134 00135 inline Vec3 Vec3::operator-(const Vec3& v) const 00136 { 00137 return Vec3(elt[0]-v[0], elt[1]-v[1], elt[2]-v[2]); 00138 } 00139 00140 inline Vec3 Vec3::operator-() const 00141 { 00142 return Vec3(-elt[0], -elt[1], -elt[2]); 00143 } 00144 00145 inline Vec3 Vec3::operator*(double s) const 00146 { 00147 return Vec3(elt[0]*s, elt[1]*s, elt[2]*s); 00148 } 00149 00150 inline Vec3 Vec3::operator/(double s) const 00151 { 00152 return Vec3(elt[0]/s, elt[1]/s, elt[2]/s); 00153 } 00154 00155 inline double Vec3::operator*(const Vec3& v) const 00156 { 00157 return elt[0]*v[0] + elt[1]*v[1] + elt[2]*v[2]; 00158 } 00159 00160 inline Vec3 Vec3::operator^(const Vec3& v) const 00161 { 00162 Vec3 w( elt[1]*v[2] - v[1]*elt[2], 00163 -elt[0]*v[2] + v[0]*elt[2], 00164 elt[0]*v[1] - v[0]*elt[1] ); 00165 return w; 00166 } 00167 00168 // Make scalar multiplication commutative 00169 inline Vec3 operator*(double s, const Vec3& v) { return v*s; } 00170 00171 00172 00174 // 00175 // Primitive function definitions 00176 // 00177 00178 inline double norm(const Vec3& v) 00179 { 00180 return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); 00181 } 00182 00183 inline double norm2(const Vec3& v) 00184 { 00185 return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; 00186 } 00187 00188 inline double length(const Vec3& v) { return norm(v); } 00189 00190 00191 inline double unitize(Vec3& v) 00192 { 00193 double l=norm2(v); 00194 if( l!=1.0 && l!=0.0 ) 00195 { 00196 l = sqrt(l); 00197 v /= l; 00198 } 00199 return l; 00200 } 00201 00202 00203 00205 // 00206 // Misc. function definitions 00207 // 00208 00209 inline std::ostream& operator<<(std::ostream& out, const Vec3& v) 00210 { 00211 return out << "[" << v[0] << " " << v[1] << " " << v[2] << "]"; 00212 } 00213 00214 #ifdef GFXGL_INCLUDED 00215 inline void glV(const Vec3& v) { glVertex(v[X], v[Y], v[Z]); } 00216 inline void glN(const Vec3& v) { glNormal(v[X], v[Y], v[Z]); } 00217 inline void glC(const Vec3& v) { glColor(v[X], v[Y], v[Z]); } 00218 #endif 00219 00220 00221 // GFXMATH_VEC3_INCLUDED 00222 #endif