Vector3.h

00001 
00006 #ifndef VECTOR3_H
00007 #define VECTOR3_H
00008 
00009 /*
00010 ** ---------------------------------------------------------------
00011 ** Includes:
00012 */
00013 #include <iostream>
00014 #include <vector>
00015 #include "defs.h"
00016 #include "Vector4.h"
00017 
00018 
00019 /*
00020 ** ---------------------------------------------------------------
00021 ** Definitions:
00022 */
00023 
00024 using namespace std;
00025 
00026 class Vector4;
00027 class Vector3;
00028 
00029 typedef vector<Vector3 *> Vector3Array;
00030 
00032 
00040 class Vector3 {
00041 
00042 public:
00043 
00044 
00046         Vector3 (void);
00048         Vector3 (Real x, Real y, Real z);
00050         Vector3(const Vector4 &vector); 
00052         Vector3(const Vector3 &vector); 
00054         ~Vector3(void);
00055         
00057         Real &operator()(int comp);
00059         Real operator()(int comp) const;
00061         Vector3 &operator=(const Vector3 &u);           
00062 
00064         Vector3 unit(void);
00066         Real norm(void);
00068         Real sqrnorm(void);
00069 
00070 private :
00071 
00073         Real x,y,z;
00074         friend class Vector4; // for row() and col()
00075 
00076 };
00077 
00079 inline Vector3 operator*(Real s, const Vector3 &u);
00081 inline Vector3 operator+(const Vector3 &u, const Vector3 &v);
00083 inline Vector3 operator-(const Vector3 &u, const Vector3 &v);
00085 inline Real operator*(const Vector3 &u, const Vector3 &v);
00087 inline Vector3 cross(const Vector3 &u, const Vector3 &v);
00089 inline Vector3 mult(const Vector3 &u,const Vector3 &v);
00091 inline Vector3 lerp(Real t, const Vector3 &u, const Vector3 &v);
00093 inline Vector3 bilerp(Real t, Real lt, const Vector3 &l0, const Vector3 &l1,
00094                           Real rt, const Vector3 &r0, const Vector3 &r1);
00095 
00097 inline istream &operator>>(istream &is, Vector3 &vector);
00099 inline ostream &operator<<(ostream &os, const Vector3 &vector);
00100 
00101 inline
00102 Vector3::Vector3(void)
00103 {
00104         x = y = z = 0.0;
00105 }
00106 
00107 inline
00108 Vector3::Vector3(const Vector3 &vector)
00109         : x(vector(0)),
00110           y(vector(1)),
00111           z(vector(2))
00112 {
00113 }
00114 
00115 inline
00116 Vector3::Vector3(Real x_, Real y_, Real z_)
00117         : x(x_),
00118           y(y_),
00119           z(z_)
00120 {
00121 }
00122 
00123 inline 
00124 Vector3::Vector3(const Vector4 &v)
00125 {
00126         Real w_ = v(3);
00127         if (REL_EQ(v(3), 0.)) 
00128                 w_ = 1.;
00129         x = v(0)/w_;
00130         y = v(1)/w_;
00131         z = v(2)/w_;
00132 }
00133 
00134 inline Vector3 &
00135 Vector3::operator=(const Vector3 &vector)
00136 {
00137         x = vector(0);
00138         y = vector(1);
00139         z = vector(2);
00140         return *this;
00141 }
00142 
00143 inline Real &
00144 Vector3::operator()(int comp)
00145 {
00146         return (comp == 0) ? x : ( (comp == 1) ? y : z );
00147 }
00148 
00149 inline Real
00150 Vector3::operator()(int comp) const
00151 {
00152         return (comp == 0) ? x : ( (comp == 1) ? y : z );
00153 }
00154 
00155 inline Vector3
00156 operator*(Real s, const Vector3 &u)
00157 {
00158         return Vector3(s*u(0), s*u(1), s*u(2));
00159 }
00160 
00161 inline Vector3
00162 operator+(const Vector3 &u, const Vector3 &v)
00163 {
00164         return Vector3(u(0) + v(0), u(1) + v(1), u(2) + v(2));
00165 }
00166 
00167 inline Vector3
00168 operator-(const Vector3 &u, const Vector3 &v)
00169 {
00170         return Vector3(u(0) - v(0), u(1) - v(1), u(2) - v(2));
00171 }
00172 
00173 inline Real
00174 operator*(const Vector3 &u, const Vector3 &v)
00175 {
00176         return u(0)*v(0) + u(1)*v(1) + u(2)*v(2);
00177 }
00178 
00179 inline Vector3 
00180 cross(const Vector3 &u, const Vector3 &v)
00181 {
00182         Vector3 uxv;
00183         uxv(0) =    u(1) * v(2) - v(1) * u(2);
00184         uxv(1) =  - u(0) * v(2) + v(0) * u(2);
00185         uxv(2) =    u(0) * v(1) - u(1) * v(0);
00186         return uxv;
00187 }
00188 
00189 inline Vector3 
00190 Vector3::unit(void)
00191 {
00192         Real  length = z_norm(this);
00193         if(fabs(length) < EPS)
00194         throw "(g3_unit) zero norm\n";
00195         else
00196         return z_scale(1.0/length,this);
00197 }
00198 
00199 inline Real
00200 Vector3::sqrnorm(void)
00201 {
00202         return (x * x + y * y + z * z);
00203 }
00204 
00205 inline Real
00206 Vector3::norm(void)
00207 {
00208         return sqrt((Real)(x * x + y * y + z * z));
00209 }
00210 
00211 inline Vector3 
00212 mult(const Vector3 &u,const Vector3 &v)
00213 {
00214         Vector3 w;
00215         w(0) = u(0) * v(0);  w(1) = u(1) * v(1);  w(2) = u(2) * v(2);
00216         return w;
00217 }
00218 
00219 inline Vector3 
00220 lerp(Real t, const Vector3 &u, const Vector3 &v)
00221 {
00222         return ((1-t)*u) + ((t)*v);
00223 }
00224 
00225 inline Vector3 
00226 bilerp(Real t, Real lt, const Vector3 &l0, const Vector3 &l1,
00227                           Real rt, const Vector3 &r0, const Vector3 &r1)
00228 {
00229         return lerp(t, lerp(lt, l0, l1), lerp(rt, r0, r1));
00230 }
00231 
00232 inline istream &
00233 operator>>(istream &is, Vector3 &vector)
00234 {
00235         is >> vector(0) >> vector(1) >> vector(2);
00236         return is;
00237 }
00238 
00239 inline ostream &
00240 operator<<(ostream &os, const Vector3 &vector)
00241 {
00242         os << vector(0) << " " << vector(1) << " " << vector(2);
00243         return os;
00244 }
00245 #endif //VECTOR3_H

Generated on Thu Jul 5 00:39:19 2007 for S3D by  doxygen 1.4.6