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