vector3D.h

Go to the documentation of this file.
00001 
00015 #ifndef _DLR_VECTOR3D_H_
00016 #define _DLR_VECTOR3D_H_
00017 
00018 #include <iostream>
00019 #include <dlrCommon/exception.h>
00020 
00021 namespace dlr {
00022 
00023   namespace numeric {
00024     
00028     class Vector3D {
00029     public:
00033       Vector3D()
00034         : m_x(0), m_y(0), m_z(0) {}
00035 
00046       Vector3D(double x, double y, double z)
00047         : m_x(x), m_y(y), m_z(z) {}
00048 
00059       Vector3D(double x, double y, double z, double alpha)
00060         : m_x(x), m_y(y), m_z(z) {this->normalize(alpha);}
00061     
00067       Vector3D(const Vector3D& source)
00068         : m_x(source.m_x), m_y(source.m_y), m_z(source.m_z) {}
00069 
00070 
00074       ~Vector3D() {}
00075 
00083       inline void setValue(double x, double y, double z) {
00084         m_x = x; m_y = y; m_z = z;
00085       }
00086 
00095       inline void setValue(double x, double y, double z,
00096                            double alpha) {
00097         m_x = x; m_y = y; m_z = z; normalize(alpha);
00098       }
00099 
00105       inline double& x() {return m_x;}
00106 
00112       inline double x() const {return m_x;}
00113 
00119       inline double& y() {return m_y;}
00120 
00126       inline double y() const {return m_y;}
00127     
00133       inline double& z() {return m_z;}
00134 
00140       inline double z() const {return m_z;}
00141 
00148       Vector3D& operator=(const Vector3D& source) {
00149         setValue(source.m_x, source.m_y, source.m_z); return *this;
00150       }
00151 
00158       Vector3D& operator*=(double scalar) {
00159         m_x *= scalar; m_y *= scalar; m_z *= scalar; return *this;
00160       }
00161 
00168       Vector3D& operator/=(double scalar) {
00169         if (scalar == 0) {
00170           DLR_THROW(ValueException, "Vector3D::operator/=(double)",
00171                     "Can't divide by zero.");
00172         }
00173         m_x /= scalar; m_y /= scalar; m_z /= scalar; return *this;
00174       }
00175 
00182       Vector3D& operator+=(const Vector3D& vec) {
00183         m_x += vec.m_x; m_y += vec.m_y; m_z += vec.m_z; return *this;
00184       }
00185 
00192       Vector3D& operator-=(const Vector3D& vec) {
00193         m_x -= vec.m_x; m_y -= vec.m_y; m_z -= vec.m_z; return *this;
00194       }
00195 
00201       Vector3D operator-() {
00202         return Vector3D(-m_x, -m_y, -m_z);
00203       }
00204     
00205     private:
00206       // Private member functions.
00207       inline void normalize(double alpha) {
00208         if(alpha == 1.0) {return;}
00209         if(alpha == 0.0) {
00210           DLR_THROW(ValueException, "Vector3D::normalize()",
00211                     "Bad alpha (0.0).");
00212         }
00213         m_x /= alpha; m_y /= alpha; m_z /= alpha;
00214         return;
00215       }
00216 
00217       // Private data members.
00218       double m_x;
00219       double m_y;
00220       double m_z;
00221     }; // class Vector3D
00222 
00223 
00224     /* ============== Non-member function declarations ============== */
00225   
00236     Vector3D
00237     operator+(const Vector3D& vector0, const Vector3D& vector1);
00238 
00251     Vector3D
00252     operator-(const Vector3D& vector0, const Vector3D& vector1);
00253   
00264     Vector3D
00265     operator*(const Vector3D& vector0, const Vector3D& vector1);
00266 
00278     Vector3D
00279     operator/(const Vector3D& vector0, const Vector3D& vector1);
00280 
00292     Vector3D operator+(const Vector3D& vector0, double scalar0);
00293 
00305     Vector3D operator-(const Vector3D& vector0, double scalar0);
00306 
00318     Vector3D operator*(const Vector3D& vector0, double scalar0);
00319 
00331     Vector3D operator/(const Vector3D& vector0, double scalar0);
00332 
00340     bool operator==(const Vector3D& vector0, const Vector3D& vector1);
00341 
00350     bool operator!=(const Vector3D& vector0, const Vector3D& vector1);
00351 
00352 
00365     Vector3D operator+(double scalar0, const Vector3D& vector0);
00366 
00367 
00380     Vector3D operator*(double scalar0, const Vector3D& vector0);
00381 
00382 
00398     std::ostream& operator<<(std::ostream& stream, const Vector3D& vector0);
00399 
00400 
00415     std::istream& operator>>(std::istream& stream, Vector3D& vector0);
00416 
00417   } // namespace numeric
00418 
00419 } // namespace dlr
00420 
00421 
00422 /* ======= Declarations to maintain compatibility with legacy code. ======= */
00423 
00424 namespace dlr {
00425 
00426   using numeric::Vector3D;
00427 
00428 } // namespace dlr
00429 
00430 /* ============ Definitions of inline & template functions ============ */
00431 
00432 namespace dlr {
00433 
00434   namespace numeric {
00435     
00436     inline Vector3D operator+(double scalar0, const Vector3D& vector0)
00437     {
00438       return vector0 + scalar0;
00439     }
00440   
00441     inline Vector3D operator*(double scalar0, const Vector3D& vector0)
00442     {
00443       return vector0 * scalar0;
00444     }
00445 
00446   } // namespace numeric
00447 
00448 } // namespace dlr
00449 
00450 #endif // #ifndef _DLR_VECTOR3D_H_

Generated on Mon Jul 9 20:34:03 2007 for dlrLibs Utility Libraries by  doxygen 1.5.2