Go to the documentation of this file.00001
00002 #ifndef vgl_vector_2d_h_
00003 #define vgl_vector_2d_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_2d
00031 {
00032 public:
00033 T x_;
00034 T y_;
00035 inline T x() const { return x_; }
00036 inline T y() const { return y_; }
00037
00038
00039 inline vgl_vector_2d () : x_(0) , y_(0) {}
00040
00041
00042 inline vgl_vector_2d (T vx, T vy) : x_(vx) , y_(vy) {}
00043
00044 #if 0 // The defaults do exactly what they should do...
00045
00046 inline vgl_vector_2d (vgl_vector_2d<T> const& v) : x_(v.x()) , y_(v.y()) {}
00047
00048 inline vgl_vector_2d<T>& operator=(vgl_vector_2d<T> const& v) {
00049 x_=v.x(); y_=v.y(); return *this; }
00050
00051 inline ~vgl_vector_2d () {}
00052 #endif
00053
00054
00055 inline void set(T vx, T vy) { x_=vx; y_=vy; }
00056
00057
00058 inline bool operator==(vgl_vector_2d<T>const& v)const{return x_==v.x()&&y_==v.y();}
00059 inline bool operator!=(vgl_vector_2d<T>const& v)const{return !operator==(v);}
00060
00061
00062 double length() const;
00063
00064
00065 inline T sqr_length() const { return x()*x()+y()*y(); }
00066
00067
00068
00069
00070
00071 vcl_istream& read(vcl_istream& is);
00072 };
00073
00074 #define v vgl_vector_2d<T>
00075
00076
00077
00078
00079
00080 template <class T> vcl_ostream& operator<<(vcl_ostream& s, v const& p);
00081
00082
00083
00084
00085
00086
00087 template <class T> vcl_istream& operator>>(vcl_istream& s, v& p);
00088
00089
00090
00091
00092
00093
00094 template <class T> inline double length(v const& a) { return a.length(); }
00095
00096
00097
00098 template <class T> inline T sqr_length(v const& a) { return a.sqr_length(); }
00099
00100
00101
00102 template <class T> inline v operator+(v const& a, v const& b) { return v(a.x()+b.x(), a.y()+b.y()); }
00103
00104
00105
00106 template <class T> inline v operator-(v const& a, v const& b) { return v(a.x()-b.x(), a.y()-b.y()); }
00107
00108
00109
00110 template <class T> inline v& operator+=(v& a, v const& b) { a.x_+=b.x_; a.y_+=b.y_; return a; }
00111
00112
00113
00114 template <class T> inline v& operator-=(v& a, v const& b) { a.x_-=b.x_; a.y_-=b.y_; return a; }
00115
00116
00117
00118 template <class T> inline v operator+(v const& b) { return b; }
00119
00120
00121
00122 template <class T> inline v operator-(v const& b) { return v(-b.x(), -b.y()); }
00123
00124
00125
00126 template <class T> inline v operator*(double s, v const& b) { return v(T(s*b.x()), T(s*b.y())); }
00127
00128
00129
00130 template <class T> inline v operator*(v const& a, double s) { return v(T(a.x()*s), T(a.y()*s)); }
00131
00132
00133
00134
00135
00136 template <class T> inline v operator/(v const& a, double s) { return v(T(a.x()/s), T(a.y()/s)); }
00137
00138
00139
00140 template <class T> inline v& operator*=(v& a, double s) { a.set(T(a.x()*s), T(a.y()*s)); return a; }
00141
00142
00143
00144 template <class T> inline v& operator/=(v& a, double s) { a.set(T(a.x()/s), T(a.y()/s)); return a; }
00145
00146
00147
00148 template <class T> inline T dot_product(v const& a, v const& b) { return a.x()*b.x()+a.y()*b.y(); }
00149
00150
00151
00152 template <class T> inline T inner_product(v const& a, v const& b) { return a.x()*b.x()+a.y()*b.y(); }
00153
00154
00155
00156 template <class T> inline T cross_product(v const& a, v const& b) { return a.x()*b.y()-a.y()*b.x(); }
00157
00158
00159
00160 template <class T> inline double cos_angle(v const& a, v const& b) { return inner_product(a,b)/(a.length()*b.length()); }
00161
00162
00163
00164 template <class T> double angle(v const& a, v const& b);
00165
00166
00167
00168
00169 template <class T> double signed_angle(v const& a, v const& b);
00170
00171
00172
00173
00174
00175 template <class T> bool orthogonal(v const& a, v const& b, double eps=0.0);
00176
00177
00178
00179
00180
00181 template <class T> bool parallel(v const& a, v const& b, double eps=0.0);
00182
00183
00184
00185
00186
00187
00188 template <class T> inline double operator/(v const& a, v const& b)
00189 { return dot_product(a,b)/(double)dot_product(b,b); }
00190
00191
00192
00193
00194 template <class T> inline v& normalize(v& a) { double l=a.length(); return l?a/=l:a; }
00195
00196
00197
00198
00199 template <class T> inline v normalized(v const& a) { double l=a.length(); return l?a/l:a; }
00200
00201
00202
00203 template <class T> v rotated(v const& a, double angle);
00204
00205 #undef v
00206
00207 #define VGL_VECTOR_2D_INSTANTIATE(T) extern "please include vgl/vgl_vector_2d.txx first"
00208
00209 #endif // vgl_vector_2d_h_