Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvector.h - QgsVector 3 : : 4 : : --------------------- 5 : : begin : 24.2.2017 6 : : copyright : (C) 2017 by Matthias Kuhn 7 : : email : matthias@opengis.ch 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #ifndef QGSVECTOR_H 17 : : #define QGSVECTOR_H 18 : : 19 : : #include "qgis.h" 20 : : #include "qgis_core.h" 21 : : #include <QtGlobal> 22 : : 23 : : /** 24 : : * \ingroup core 25 : : * \brief A class to represent a vector. 26 : : * Currently no Z axis / 2.5D support is implemented. 27 : : */ 28 : : 29 : : class CORE_EXPORT QgsVector 30 : : { 31 : : 32 : : public: 33 : : 34 : : /** 35 : : * Default constructor for QgsVector. Creates a vector with length of 0.0. 36 : : */ 37 : 400 : QgsVector() = default; 38 : : 39 : : /** 40 : : * Constructor for QgsVector taking x and y component values. 41 : : * \param x x-component 42 : : * \param y y-component 43 : : */ 44 : 6034 : QgsVector( double x, double y ) 45 : 6034 : : mX( x ) 46 : 6034 : , mY( y ) 47 : : { 48 : 6034 : } 49 : : 50 : : //! Swaps the sign of the x and y components of the vector. 51 : : QgsVector operator-() const SIP_HOLDGIL 52 : : { 53 : : return QgsVector( -mX, -mY ); 54 : : } 55 : : 56 : : /** 57 : : * Returns a vector where the components have been multiplied by a scalar value. 58 : : * \param scalar factor to multiply by 59 : : */ 60 : 2512 : QgsVector operator*( double scalar ) const SIP_HOLDGIL 61 : : { 62 : 2512 : return QgsVector( mX * scalar, mY * scalar ); 63 : : } 64 : : 65 : : /** 66 : : * Returns a vector where the components have been divided by a scalar value. 67 : : * \param scalar factor to divide by 68 : : */ 69 : 2500 : QgsVector operator/( double scalar ) const SIP_HOLDGIL 70 : : { 71 : 2500 : return *this * ( 1.0 / scalar ); 72 : : } 73 : : 74 : : /** 75 : : * Returns the dot product of two vectors, which is the sum of the x component 76 : : * of this vector multiplied by the x component of another 77 : : * vector plus the y component of this vector multiplied by the y component of another vector. 78 : : */ 79 : 1049 : double operator*( QgsVector v ) const SIP_HOLDGIL 80 : : { 81 : 1049 : return mX * v.mX + mY * v.mY; 82 : : } 83 : : 84 : : /** 85 : : * Adds another vector to this vector. 86 : : * \since QGIS 3.0 87 : : */ 88 : 0 : QgsVector operator+( QgsVector other ) const SIP_HOLDGIL 89 : : { 90 : 0 : return QgsVector( mX + other.mX, mY + other.mY ); 91 : : } 92 : : 93 : : /** 94 : : * Adds another vector to this vector in place. 95 : : * \since QGIS 3.0 96 : : */ 97 : : QgsVector &operator+=( QgsVector other ) SIP_HOLDGIL 98 : : { 99 : : mX += other.mX; 100 : : mY += other.mY; 101 : : return *this; 102 : : } 103 : : 104 : : /** 105 : : * Subtracts another vector to this vector. 106 : : * \since QGIS 3.0 107 : : */ 108 : : QgsVector operator-( QgsVector other ) const SIP_HOLDGIL 109 : : { 110 : : return QgsVector( mX - other.mX, mY - other.mY ); 111 : : } 112 : : 113 : : /** 114 : : * Subtracts another vector to this vector in place. 115 : : * \since QGIS 3.0 116 : : */ 117 : : QgsVector &operator-=( QgsVector other ) SIP_HOLDGIL 118 : : { 119 : : mX -= other.mX; 120 : : mY -= other.mY; 121 : : return *this; 122 : : } 123 : : 124 : : /** 125 : : * Returns the length of the vector. 126 : : * \see lengthSquared() 127 : : */ 128 : 2620 : double length() const SIP_HOLDGIL 129 : : { 130 : 2620 : return std::sqrt( mX * mX + mY * mY ); 131 : : } 132 : : 133 : : /** 134 : : * Returns the length of the vector. 135 : : * \see length() 136 : : * \since QGIS 3.2 137 : : */ 138 : 0 : double lengthSquared() const SIP_HOLDGIL 139 : : { 140 : 0 : return mX * mX + mY * mY; 141 : : } 142 : : 143 : : /** 144 : : * Returns the vector's x-component. 145 : : * \see y() 146 : : */ 147 : 3506 : double x() const SIP_HOLDGIL 148 : : { 149 : 3506 : return mX; 150 : : } 151 : : 152 : : /** 153 : : * Returns the vector's y-component. 154 : : * \see x() 155 : : */ 156 : 3506 : double y() const SIP_HOLDGIL 157 : : { 158 : 3506 : return mY; 159 : : } 160 : : 161 : : /** 162 : : * Returns the perpendicular vector to this vector (rotated 90 degrees counter-clockwise) 163 : : */ 164 : 0 : QgsVector perpVector() const SIP_HOLDGIL 165 : : { 166 : 0 : return QgsVector( -mY, mX ); 167 : : } 168 : : 169 : : /** 170 : : * Returns the angle of the vector in radians. 171 : : */ 172 : 0 : double angle() const SIP_HOLDGIL 173 : : { 174 : 0 : double angle = std::atan2( mY, mX ); 175 : 0 : return angle < 0.0 ? angle + 2.0 * M_PI : angle; 176 : : } 177 : : 178 : : /** 179 : : * Returns the angle between this vector and another vector in radians. 180 : : */ 181 : : double angle( QgsVector v ) const SIP_HOLDGIL 182 : : { 183 : : return v.angle() - angle(); 184 : : } 185 : : 186 : : /** 187 : : * Returns the 2D cross product of this vector and another vector \a v. (This is sometimes 188 : : * referred to as a "perpendicular dot product", and equals x1 * y1 - y1 * x2). 189 : : * 190 : : * \since QGIS 3.2 191 : : */ 192 : 0 : double crossProduct( QgsVector v ) const SIP_HOLDGIL 193 : : { 194 : 0 : return mX * v.y() - mY * v.x(); 195 : : } 196 : : 197 : : /** 198 : : * Rotates the vector by a specified angle. 199 : : * \param rot angle in radians 200 : : */ 201 : : QgsVector rotateBy( double rot ) const SIP_HOLDGIL; 202 : : 203 : : /** 204 : : * Returns the vector's normalized (or "unit") vector (ie same angle but length of 1.0). 205 : : * 206 : : * \throws QgsException if called on a vector with length of 0. 207 : : */ 208 : : QgsVector normalized() const SIP_THROW( QgsException ); 209 : : 210 : : //! Equality operator 211 : 2 : bool operator==( QgsVector other ) const SIP_HOLDGIL 212 : : { 213 : 2 : return qgsDoubleNear( mX, other.mX ) && qgsDoubleNear( mY, other.mY ); 214 : : } 215 : : 216 : : //! Inequality operator 217 : : bool operator!=( QgsVector other ) const 218 : : { 219 : : return !qgsDoubleNear( mX, other.mX ) || !qgsDoubleNear( mY, other.mY ); 220 : : } 221 : : 222 : : /** 223 : : * Returns a string representation of the vector. 224 : : * Members will be truncated to the specified \a precision. 225 : : */ 226 : : QString toString( int precision = 17 ) const SIP_HOLDGIL 227 : : { 228 : : QString str = "Vector ("; 229 : : str += qgsDoubleToString( mX, precision ); 230 : : str += ", "; 231 : : str += qgsDoubleToString( mY, precision ); 232 : : str += ')'; 233 : : return str; 234 : : } 235 : : 236 : : #ifdef SIP_RUN 237 : : SIP_PYOBJECT __repr__(); 238 : : % MethodCode 239 : : QString str = QStringLiteral( "<QgsVector: %1>" ).arg( sipCpp->toString() ); 240 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 241 : : % End 242 : : #endif 243 : : 244 : : private: 245 : 400 : double mX = 0.0; 246 : 400 : double mY = 0.0; 247 : : 248 : : }; 249 : : 250 : : Q_DECLARE_TYPEINFO( QgsVector, Q_MOVABLE_TYPE ); 251 : : 252 : : #endif // QGSVECTOR_H