From d3ff868b9292c8c3ecd10fced40fe940ce2018d0 Mon Sep 17 00:00:00 2001 From: Alexander Afanasyev Date: Tue, 13 Dec 2011 21:39:24 -0800 Subject: [PATCH] core: Small extension of Vector class (math operations) --- src/core/model/vector.cc | 137 ++++++++++++++++++++++++++++++++++++++++++++++ src/core/model/vector.h | 35 ++++++++++++ 2 files changed, 172 insertions(+) diff --git a/src/core/model/vector.cc b/src/core/model/vector.cc index 66b1220..f651f44 100644 --- a/src/core/model/vector.cc +++ b/src/core/model/vector.cc @@ -47,6 +47,68 @@ Vector3D::Vector3D () { } +double +Vector3D::GetLength () const +{ + return sqrt (x*x + y*y + z*z); +} + +Vector3D& +Vector3D::operator += (const Vector3D &v) +{ + x += v.x; + y += v.y; + z += v.z; + + return *this; +} + +Vector3D& +Vector3D::operator += (double v) +{ + x += v; + y += v; + z += v; + + return *this; +} + +Vector3D +Vector3D::operator + (const Vector3D &v) const +{ + return Vector3D (x+v.x, y+v.y, z+v.z); +} + +Vector3D +Vector3D::operator + (double v) const +{ + return Vector3D (x+v, y+v, z+v); +} + +Vector3D +Vector3D::operator * (const Vector3D &v) const +{ + return Vector3D (x*v.x, y*v.y, z*v.z); +} + +Vector3D +Vector3D::operator * (double v) const +{ + return Vector3D (x*v, y*v, z*v); +} + +Vector3D +Vector3D::operator - (const Vector3D &v) const +{ + return Vector3D (x-v.x, y-v.y, z-v.z); +} + +Vector3D +Vector3D::operator / (double div) const +{ + return Vector3D (x/div, y/div, z/div); +} + Vector2D::Vector2D (double _x, double _y) : x (_x), y (_y) @@ -60,6 +122,66 @@ Vector2D::Vector2D () } double +Vector2D::GetLength () const +{ + return sqrt (x*x + y*y); +} + +Vector2D& +Vector2D::operator += (const Vector2D &v) +{ + x += v.x; + y += v.y; + + return *this; +} + +Vector2D& +Vector2D::operator += (double v) +{ + x += v; + y += v; + + return *this; +} + +Vector2D +Vector2D::operator + (const Vector2D &v) const +{ + return Vector2D (x+v.x, y+v.y); +} + +Vector2D +Vector2D::operator + (double v) const +{ + return Vector2D (x+v, y+v); +} + +Vector2D +Vector2D::operator * (const Vector2D &v) const +{ + return Vector2D (x*v.x, y*v.y); +} + +Vector2D +Vector2D::operator * (double v) const +{ + return Vector2D (x*v, y*v); +} + +Vector2D +Vector2D::operator - (const Vector2D &v) const +{ + return Vector2D (x-v.x, y-v.y); +} + +Vector2D +Vector2D::operator / (double div) const +{ + return Vector2D (x/div, y/div); +} + +double CalculateDistance (const Vector3D &a, const Vector3D &b) { double dx = b.x - a.x; @@ -77,6 +199,21 @@ CalculateDistance (const Vector2D &a, const Vector2D &b) return distance; } + +double +ScalarMultiplication (const Vector3D &a, const Vector3D &b) +{ + Vector3D tmp = a * b; + return tmp.x + tmp.y + tmp.z; +} + +double +ScalarMultiplication (const Vector2D &a, const Vector2D &b) +{ + Vector2D tmp = a * b; + return tmp.x + tmp.y; +} + std::ostream &operator << (std::ostream &os, const Vector3D &vector) { os << vector.x << ":" << vector.y << ":" << vector.z; diff --git a/src/core/model/vector.h b/src/core/model/vector.h index eaf0819..00e8053 100644 --- a/src/core/model/vector.h +++ b/src/core/model/vector.h @@ -55,6 +55,17 @@ public: * z coordinate of vector */ double z; + + double GetLength () const; + + Vector3D& operator += (const Vector3D &); + Vector3D& operator += (double); + Vector3D operator + (const Vector3D &) const; + Vector3D operator + (double) const; + Vector3D operator * (const Vector3D &) const; + Vector3D operator * (double v) const; + Vector3D operator - (const Vector3D &) const; + Vector3D operator / (double) const; }; /** @@ -82,6 +93,17 @@ public: * y coordinate of vector */ double y; + + double GetLength () const; + + Vector2D& operator += (const Vector2D &); + Vector2D& operator += (double); + Vector2D operator + (const Vector2D &) const; + Vector2D operator + (double) const; + Vector2D operator * (const Vector2D &) const; + Vector2D operator * (double v) const; + Vector2D operator - (const Vector2D &) const; + Vector2D operator / (double) const; }; /** @@ -99,6 +121,19 @@ double CalculateDistance (const Vector3D &a, const Vector3D &b); double CalculateDistance (const Vector2D &a, const Vector2D &b); /** + * \brief Calculate scalar multiplication between two vectors + * \param a one point + * \param b another point + */ +double ScalarMultiplication (const Vector3D &a, const Vector3D &b); +/** + * \brief Calculate scalar multiplication between two vectors + * \param a one point + * \param b another point + */ +double ScalarMultiplication (const Vector2D &a, const Vector2D &b); + +/** * \class ns3::Vector3DValue * \brief hold objects of type ns3::Vector3D */ -- 1.7.9.2