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
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
00218 double m_x;
00219 double m_y;
00220 double m_z;
00221 };
00222
00223
00224
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 }
00418
00419 }
00420
00421
00422
00423
00424 namespace dlr {
00425
00426 using numeric::Vector3D;
00427
00428 }
00429
00430
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 }
00447
00448 }
00449
00450 #endif // #ifndef _DLR_VECTOR3D_H_