00001
00006 #ifndef VECTOR3_H
00007 #define VECTOR3_H
00008
00009
00010
00011
00012
00013 #include <iostream>
00014 #include <vector>
00015 #include "defs.h"
00016 #include "Vector4.h"
00017
00018
00019
00020
00021
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;
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