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
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
0028 class Vector2 : public Vector<2> {
0029
0030
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
0073 double dot(const Vector2& v) const {
0074 return _vec.dot(v._vec);
0075 }
0076
0077
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
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
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
0177 inline double angle(const Vector2& a, const Vector2& b) {
0178 return a.angle(b);
0179 }
0180
0181
0182 }
0183
0184 #endif