00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __POINT_H
00034 #define __POINT_H
00035
00036 #include "OFELI_Config.h"
00037
00038 #include <iostream>
00039 using std::ostream;
00040
00041 #include <iomanip>
00042 using std::setw;
00043 using std::ios;
00044
00045 #include <math.h>
00046
00047
00048 namespace OFELI {
00049
00066 template<class T_>
00067 struct Point {
00068
00070 Point() { x = y = z = T_(0); }
00071
00074 Point(T_ a, T_ b=T_(0), T_ c=T_(0)) { x = a; y = b; z = c; }
00075
00077 Point(T_ *a) { x = a[0]; y = a[1]; z = a[2]; }
00078
00080 Point(const Point<T_> &pt) { x = pt.x; y = pt.y; z = pt.z; }
00081
00084 T_ &operator()(size_t i)
00085 {
00086 if (i==2)
00087 return y;
00088 else if (i==3)
00089 return z;
00090 else
00091 return x;
00092 }
00093
00096 const T_ &operator()(size_t i) const
00097 {
00098 if (i==2)
00099 return y;
00100 else if (i==3)
00101 return z;
00102 else
00103 return x;
00104 }
00105
00108 T_ &operator[](size_t i)
00109 {
00110 if (i==1)
00111 return y;
00112 else if (i==2)
00113 return z;
00114 else
00115 return x;
00116 }
00117
00120 const T_ &operator[](size_t i) const
00121 {
00122 if (i==1)
00123 return y;
00124 else if (i==2)
00125 return z;
00126 else
00127 return x;
00128 }
00129
00132 Point<T_> & operator=(const Point<T_> &p) { x = p.x; y = p.y; z = p.z; return *this; }
00133
00136 Point<T_> & operator+=(const Point<T_> &p) { x+=p.x; y+=p.y; z+=p.z; return *this; }
00137
00140 Point<T_> & operator-=(const Point<T_> &p) { x-=p.x; y-=p.y; z-=p.z; return *this; }
00141
00144 Point<T_> & operator=(const T_ &a) { x = y = z = a; return *this; }
00145
00148 Point<T_> & operator+=(const T_ &a) { x+=a; y+=a; z+=a; return *this; }
00149
00152 Point<T_> & operator-=(const T_ &a) { x-=a; y-=a; z-=a; return *this; }
00153
00156 Point<T_> & operator*=(const T_ &a) { x*=a; y*=a; z*=a; return *this; }
00157
00160 Point<T_> & operator/=(const T_ &a) { x/=a; y/=a; z/=a; return *this; }
00161
00165 bool operator==(const Point<T_> &p)
00166 {
00167 if (p.x==x && p.y==y && p.z==z)
00168 return true;
00169 return false;
00170 }
00171
00175 bool operator!=(const Point<T_> &p)
00176 {
00177 if (p.x!=x || p.y!=y || p.z!=z)
00178 return true;
00179 return false;
00180 }
00181
00183 double NNorm() const { return (x*x + y*y + z*z); }
00184
00186 double Norm() const { return sqrt(NNorm()); }
00187
00190 void Normalize()
00191 {
00192 double n = Norm();
00193 x /= n;
00194 y /= n;
00195 z /= n;
00196 }
00197
00199 Point<double> Director(const Point<double> &p) const
00200 {
00201 double n = p.Norm();
00202 return Point<double>(p.x/n,p.y/n,p.z/n);
00203 }
00204
00206 bool isCloseTo(const Point<double> &a, double toler=OFELI_TOLERANCE) const
00207 {
00208 return (*this,a,toler);
00209 }
00210
00212 T_ x;
00213
00215 T_ y;
00216
00218 T_ z;
00219
00220 };
00221
00222
00224
00226
00231 template <class T_>
00232 bool operator== (const Point<T_> &a, const Point<T_> &b) {
00233 return (a.x==b.x && a.y==b.y && a.z==b.z);
00234 }
00235
00240 template <class T_>
00241 Point<T_> operator+ (const Point<T_> &a, const Point<T_> &b) { return Point<T_>(a.x+b.x,a.y+b.y,a.z+b.z); }
00242
00247 template <class T_>
00248 Point<T_> operator+ (const Point<T_> &a, const T_ &x) { return Point<T_>(a.x+x,a.y+x,a.z+x); }
00249
00250
00255 template <class T_>
00256 Point<T_> operator- (const Point<T_> &a) { return Point<T_>(-a.x,-a.y,-a.z); }
00257
00258
00263 template <class T_>
00264 Point<T_> operator- (const Point<T_> &a, const Point<T_> &b) { return Point<T_>(a.x-b.x,a.y-b.y,a.z-b.z); }
00265
00266
00271 template <class T_>
00272 Point<T_> operator- (const Point<T_> &a, const T_ &x) { return Point<T_>(a.x-x,a.y-x,a.z-x); }
00273
00274
00279 template <class T_>
00280 Point<T_> operator* (const T_ &a, const Point<T_> &b) { return Point<T_>(a*b.x,a*b.y,a*b.z); }
00281
00282
00287 template <class T_>
00288 Point<T_> operator* (const int &a, const Point<T_> &b) { return Point<T_>(a*b.x,a*b.y,a*b.z); }
00289
00290
00295 template <class T_>
00296 Point<T_> operator* (const Point<T_> &b, const T_ &a) { return Point<T_>(a*b.x,a*b.y,a*b.z);}
00297
00298
00303 template <class T_>
00304 Point<T_> operator* (const Point<T_> &b, const int &a) { return Point<T_>(a*b.x,a*b.y,a*b.z);}
00305
00306
00311 template <class T_>
00312 T_ operator* (const Point<T_> &b, const Point<T_> &a) { return (a.x*b.x+a.y*b.y+a.z*b.z); }
00313
00314
00319 template <class T_>
00320 Point<T_> operator/ (const Point<T_> &b, const T_ &a) { return Point<T_>(b.x/a,b.y/a,b.z/a);}
00321
00324 inline Point<double> CrossProduct(const Point<double> &lp, const Point<double> &rp)
00325 {
00326 return Point<double>(lp.y*rp.z-lp.z*rp.y,lp.z*rp.x-lp.x*rp.z,lp.x*rp.y-lp.y*rp.x);
00327 }
00328
00333 inline bool areClose(const Point<double> &a, const Point<double> &b, double toler=OFELI_TOLERANCE)
00334 {
00335 if (((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)) < toler*toler)
00336 return true;
00337 else
00338 return false;
00339 }
00340
00344 inline double SqrDistance(const Point<double> &a, const Point<double> &b)
00345 {
00346 return ((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) + (a.z-b.z)*(a.z-b.z));
00347 }
00348
00352 inline double Distance(const Point<double> &a, const Point<double> &b)
00353 {
00354 return sqrt(SqrDistance(a,b));
00355 }
00356
00361 template <class T_>
00362 std::ostream & operator<<(std::ostream &s, const Point<T_> &a)
00363 {
00364 s.setf(ios::scientific);
00365 s << "( " << std::setprecision(8) << setw(12) << a.x << " , ";
00366 s << setw(12) << a.y << " , " << setw(12) << a.z << " )";
00367 return s;
00368 }
00369
00370 }
00371
00372 #endif