00001
00002 #ifndef vgl_vector_3d_h_
00003 #define vgl_vector_3d_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <vcl_iosfwd.h>
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 template <class T>
00030 class vgl_vector_3d
00031 {
00032 public:
00033 T x_;
00034 T y_;
00035 T z_;
00036 inline T x() const { return x_; }
00037 inline T y() const { return y_; }
00038 inline T z() const { return z_; }
00039
00040
00041 inline vgl_vector_3d() : x_(0) , y_(0) , z_(0) {}
00042
00043
00044 inline vgl_vector_3d(T vx, T vy, T vz) : x_(vx) , y_(vy) , z_(vz) {}
00045
00046
00047 inline vgl_vector_3d(const T v[3]) : x_(v[0]), y_(v[1]), z_(v[2]) {}
00048
00049 #if 0 // The defaults do exactly what they should do...
00050
00051 inline vgl_vector_3d (vgl_vector_3d<T>const&v):x_(v.x()),y_(v.y()),z_(v.z()){}
00052
00053 inline vgl_vector_3d<T>& operator=(vgl_vector_3d<T> const& v) {
00054 x_=v.x(); y_=v.y(); z_=v.z(); return *this; }
00055
00056 inline ~vgl_vector_3d () {}
00057 #endif
00058
00059
00060 inline void set(T vx, T vy, T vz) { x_=vx; y_=vy; z_=vz; }
00061
00062
00063 inline void set (T const v[3]) { x_ = v[0]; y_ = v[1]; z_ = v[2]; }
00064
00065
00066 inline bool operator==(vgl_vector_3d<T>const& v) const {
00067 return x_==v.x() && y_==v.y() && z_==v.z(); }
00068 inline bool operator!=(vgl_vector_3d<T>const& v)const{return !operator==(v);}
00069
00070
00071 double length() const;
00072
00073
00074 inline T sqr_length() const { return x()*x()+y()*y()+z()*z(); }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 vgl_vector_3d<T> orthogonal_vectors(double s) const;
00086
00087
00088
00089
00090
00091
00092 vcl_istream& read(vcl_istream& is);
00093 };
00094
00095 #define v vgl_vector_3d<T>
00096
00097
00098
00099
00100
00101 template <class T> vcl_ostream& operator<<(vcl_ostream& s, v const& p);
00102
00103
00104
00105
00106
00107
00108 template <class T> vcl_istream& operator>>(vcl_istream& s, v& p);
00109
00110
00111
00112
00113
00114
00115 template <class T> inline double length(v const& a) { return a.length(); }
00116
00117
00118
00119 template <class T> inline T sqr_length(v const& a) { return a.sqr_length(); }
00120
00121
00122
00123 template <class T> inline v operator+(v const& a, v const& b) { return v(a.x()+b.x(), a.y()+b.y(), a.z()+b.z()); }
00124
00125
00126
00127 template <class T> inline v operator-(v const& a, v const& b) { return v(a.x()-b.x(), a.y()-b.y(), a.z()-b.z()); }
00128
00129
00130
00131 template <class T> inline v& operator+=(v& a, v const& b) { a.x_+=b.x_; a.y_+=b.y_; a.z_+=b.z_; return a; }
00132
00133
00134
00135 template <class T> inline v& operator-=(v& a, v const& b) { a.x_-=b.x_; a.y_-=b.y_; a.z_-=b.z_; return a; }
00136
00137
00138
00139 template <class T> inline v operator+(v const& b) { return b; }
00140
00141
00142
00143 template <class T> inline v operator-(v const& b) { return v(-b.x(), -b.y(), -b.z()); }
00144
00145
00146
00147 template <class T> inline v operator*(double s, v const& b) { return v(T(s*b.x()), T(s*b.y()), T(s*b.z())); }
00148
00149
00150
00151 template <class T> inline v operator*(v const& a, double s) { return v(T(a.x()*s), T(a.y()*s), T(a.z()*s)); }
00152
00153
00154
00155
00156
00157 template <class T> inline v operator/(v const& a, double s) { return v(T(a.x()/s), T(a.y()/s), T(a.z()/s)); }
00158
00159
00160
00161 template <class T> inline v& operator*=(v& a, double s) { a.set(T(a.x()*s), T(a.y()*s), T(a.z()*s)); return a; }
00162
00163
00164
00165 template <class T> inline v& operator/=(v& a, double s) { a.set(T(a.x()/s), T(a.y()/s), T(a.z()/s)); return a; }
00166
00167
00168
00169 template <class T> inline T dot_product(v const& a, v const& b) { return a.x()*b.x()+a.y()*b.y()+a.z()*b.z(); }
00170
00171
00172
00173 template <class T> inline T inner_product(v const& a, v const& b) { return a.x()*b.x()+a.y()*b.y()+a.z()*b.z(); }
00174
00175
00176
00177 template <class T> inline v cross_product(v const& a, v const& b)
00178 { return v(a.y()*b.z()-a.z()*b.y(), a.z()*b.x()-a.x()*b.z(), a.x()*b.y()-a.y()*b.x()); }
00179
00180
00181
00182 template <class T> inline double cos_angle(v const& a, v const& b) { return inner_product(a,b)/(a.length()*b.length()); }
00183
00184
00185
00186 template <class T> double angle(v const& a, v const& b);
00187
00188
00189
00190
00191
00192 template <class T> bool orthogonal(v const& a, v const& b, double eps=0.0);
00193
00194
00195
00196
00197
00198 template <class T> bool parallel(v const& a, v const& b, double eps=0.0);
00199
00200
00201
00202
00203
00204
00205 template <class T> inline double operator/(v const& a, v const& b)
00206 { return dot_product(a,b)/(double)dot_product(b,b); }
00207
00208
00209
00210
00211 template <class T> inline v& normalize(v& a) { double l=a.length(); return l?a/=l:a; }
00212
00213
00214
00215
00216 template <class T> inline v normalized(v const& a) { double l=a.length(); return l?a/l:a; }
00217
00218
00219
00220
00221
00222
00223
00224
00225 template <class T> v orthogonal_vectors(v const& a, double s);
00226
00227 #undef v
00228
00229 #define VGL_VECTOR_3D_INSTANTIATE(T) extern "please include vgl/vgl_vector_3d.txx first"
00230
00231 #endif // vgl_vector_3d_h_