Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 09:06:47

0001 #ifndef RIVET_MATH_VECTOR2
0002 #define RIVET_MATH_VECTOR2
0003 
0004 #include "Rivet/Math/MathConstants.hh"
0005 #include "Rivet/Math/MathUtils.hh"
0006 #include "Rivet/Math/VectorN.hh"
0007 
0008 namespace Rivet {
0009 
0010 
0011   class Vector2;
0012   typedef Vector2 TwoVector;
0013   typedef Vector2 V2;
0014 
0015   //class Matrix2;
0016 
0017   Vector2 multiply(const double, const Vector2&);
0018   Vector2 multiply(const Vector2&, const double);
0019   Vector2 add(const Vector2&, const Vector2&);
0020   Vector2 operator*(const double, const Vector2&);
0021   Vector2 operator*(const Vector2&, const double);
0022   Vector2 operator/(const Vector2&, const double);
0023   Vector2 operator+(const Vector2&, const Vector2&);
0024   Vector2 operator-(const Vector2&, const Vector2&);
0025 
0026 
0027   /// @brief Two-dimensional specialisation of Vector.
0028   class Vector2 : public Vector<2> {
0029 
0030     // friend class Matrix2;
0031     friend Vector2 multiply(const double, const Vector2&);
0032     friend Vector2 multiply(const Vector2&, const double);
0033     friend Vector2 add(const Vector2&, const Vector2&);
0034     friend Vector2 subtract(const Vector2&, const Vector2&);
0035 
0036   public:
0037     Vector2() : Vector<2>() { }
0038 
0039     template<typename V2TYPE>
0040     Vector2(const V2TYPE& other) {
0041       this->setX(other.x());
0042       this->setY(other.y());
0043     }
0044 
0045     Vector2(const Vector<2>& other) {
0046       this->setX(other.get(0));
0047       this->setY(other.get(1));
0048     }
0049 
0050     Vector2(double x, double y) {
0051       this->setX(x);
0052       this->setY(y);
0053     }
0054 
0055     ~Vector2() { }
0056 
0057 
0058   public:
0059 
0060     static Vector2 mkX() { return Vector2(1,0); }
0061     static Vector2 mkY() { return Vector2(0,1); }
0062 
0063 
0064   public:
0065 
0066     double x() const { return get(0); }
0067     double y() const { return get(1); }
0068     Vector2& setX(double x) { set(0, x); return *this; }
0069     Vector2& setY(double y) { set(1, y); return *this; }
0070 
0071 
0072     /// Dot-product with another vector
0073     double dot(const Vector2& v) const {
0074       return _vec.dot(v._vec);
0075     }
0076 
0077     /// Angle in radians to another vector
0078     double angle(const Vector2& v) const {
0079       const double localDotOther = unit().dot(v.unit());
0080       if (localDotOther > 1.0) return 0.0;
0081       if (localDotOther < -1.0) return M_PI;
0082       return acos(localDotOther);
0083     }
0084 
0085 
0086     /// Unit-normalized version of this vector.
0087     Vector2 unitVec() const {
0088       double md = mod();
0089       if ( md <= 0.0 ) return Vector2();
0090       else return *this * 1.0/md;
0091     }
0092 
0093     /// Synonym for unitVec
0094     Vector2 unit() const {
0095       return unitVec();
0096     }
0097 
0098 
0099   public:
0100     Vector2& operator*=(const double a) {
0101       _vec = multiply(a, *this)._vec;
0102       return *this;
0103     }
0104 
0105     Vector2& operator/=(const double a) {
0106       _vec = multiply(1.0/a, *this)._vec;
0107       return *this;
0108     }
0109 
0110     Vector2& operator+=(const Vector2& v) {
0111       _vec = add(*this, v)._vec;
0112       return *this;
0113     }
0114 
0115     Vector2& operator-=(const Vector2& v) {
0116       _vec = subtract(*this, v)._vec;
0117       return *this;
0118     }
0119 
0120     Vector2 operator-() const {
0121       Vector2 rtn;
0122       rtn._vec = -_vec;
0123       return rtn;
0124     }
0125 
0126   };
0127 
0128 
0129 
0130   inline double dot(const Vector2& a, const Vector2& b) {
0131     return a.dot(b);
0132   }
0133 
0134   inline Vector2 multiply(const double a, const Vector2& v) {
0135     Vector2 result;
0136     result._vec = a * v._vec;
0137     return result;
0138   }
0139 
0140   inline Vector2 multiply(const Vector2& v, const double a) {
0141     return multiply(a, v);
0142   }
0143 
0144   inline Vector2 operator*(const double a, const Vector2& v) {
0145     return multiply(a, v);
0146   }
0147 
0148   inline Vector2 operator*(const Vector2& v, const double a) {
0149     return multiply(a, v);
0150   }
0151 
0152   inline Vector2 operator/(const Vector2& v, const double a) {
0153     return multiply(1.0/a, v);
0154   }
0155 
0156   inline Vector2 add(const Vector2& a, const Vector2& b) {
0157     Vector2 result;
0158     result._vec = a._vec + b._vec;
0159     return result;
0160   }
0161 
0162   inline Vector2 subtract(const Vector2& a, const Vector2& b) {
0163     Vector2 result;
0164     result._vec = a._vec - b._vec;
0165     return result;
0166   }
0167 
0168   inline Vector2 operator+(const Vector2& a, const Vector2& b) {
0169     return add(a, b);
0170   }
0171 
0172   inline Vector2 operator-(const Vector2& a, const Vector2& b) {
0173     return subtract(a, b);
0174   }
0175 
0176   /// Angle (in radians) between two 2-vectors.
0177   inline double angle(const Vector2& a, const Vector2& b) {
0178     return a.angle(b);
0179   }
0180 
0181 
0182 }
0183 
0184 #endif