Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsquadrilateral.h 3 : : ------------------- 4 : : begin : November 2018 5 : : copyright : (C) 2018 by Loïc Bartoletti 6 : : email : loic dot bartoletti at oslandia dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSQUADRILATERAL_H 19 : : #define QGSQUADRILATERAL_H 20 : : 21 : : 22 : : #include "qgis_core.h" 23 : : #include "qgspoint.h" 24 : : #include "qgspolygon.h" 25 : : #include "qgslinestring.h" 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \class QgsQuadrilateral 30 : : * \brief Quadrilateral geometry type. 31 : : * 32 : : * A quadrilateral is a polygon with four edges (or sides) and four vertices or corners. 33 : : * This class allows the creation of simple quadrilateral (which does not self-intersect). 34 : : * \since QGIS 3.6 35 : : */ 36 : 102 : class CORE_EXPORT QgsQuadrilateral 37 : : { 38 : : public: 39 : : 40 : : /** 41 : : * Constructor for an empty quadrilateral geometry. 42 : : */ 43 : : QgsQuadrilateral() SIP_HOLDGIL; 44 : : 45 : : /** 46 : : * Construct a QgsQuadrilateral from four QgsPoint. 47 : : * \param p1 first point 48 : : * \param p2 second point 49 : : * \param p3 third point 50 : : * \param p4 fourth point 51 : : * \see setPoints 52 : : */ 53 : : QgsQuadrilateral( const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, const QgsPoint &p4 ) SIP_HOLDGIL; 54 : : 55 : : /** 56 : : * Construct a QgsQuadrilateral from four QgsPointXY. 57 : : * \param p1 first point 58 : : * \param p2 second point 59 : : * \param p3 third point 60 : : * \param p4 fourth point 61 : : * \see setPoints 62 : : */ 63 : : explicit QgsQuadrilateral( const QgsPointXY &p1, const QgsPointXY &p2, const QgsPointXY &p3, const QgsPointXY &p4 ) SIP_HOLDGIL; 64 : : 65 : : 66 : : /** 67 : : * A quadrilateral can be constructed from 3 points where the second distance can be determined by the third point. 68 : : * 69 : : */ 70 : : enum ConstructionOption 71 : : { 72 : : Distance, //!< Second distance is equal to the distance between 2nd and 3rd point 73 : : Projected, //!< Second distance is equal to the distance of the perpendicualr projection of the 3rd point on the segment or its extension. 74 : : }; 75 : : 76 : : /** 77 : : * Construct a QgsQuadrilateral as a Rectangle from 3 points. 78 : : * In the case where one of the points is of type PointZ. The other points 79 : : * will also be of type Z, even if they are of type Point. In addition, 80 : : * the z used will be the one of the first point with a Z. 81 : : * This ensures consistency in point types and the ability to export to a 82 : : * Polygon or LineString. 83 : : * \param p1 first point 84 : : * \param p2 second point 85 : : * \param p3 third point 86 : : * \param mode Construction mode to construct the rectangle from 3 points 87 : : * \see ConstructionOption 88 : : */ 89 : : static QgsQuadrilateral rectangleFrom3Points( const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, ConstructionOption mode ) SIP_HOLDGIL; 90 : : 91 : : /** 92 : : * Construct a QgsQuadrilateral as a rectangle from an extent, defined by 93 : : * two opposite corner points. 94 : : * Z is taken from point \a p1. 95 : : * \param p1 first point 96 : : * \param p2 second point 97 : : */ 98 : : static QgsQuadrilateral rectangleFromExtent( const QgsPoint &p1, const QgsPoint &p2 ) SIP_HOLDGIL; 99 : : 100 : : #ifndef SIP_RUN 101 : : 102 : : /** 103 : : * Alias for rectangleFromDiagonal 104 : : */ 105 : : static constexpr auto &rectangleFromDiagonal = rectangleFromExtent; 106 : : #endif 107 : : 108 : : /** 109 : : * Construct a QgsQuadrilateral as a square from a diagonal. 110 : : * Z is taken from point \a p1. 111 : : * \param p1 first point 112 : : * \param p2 second point 113 : : */ 114 : : static QgsQuadrilateral squareFromDiagonal( const QgsPoint &p1, const QgsPoint &p2 ) SIP_HOLDGIL; 115 : : 116 : : /** 117 : : * Construct a QgsQuadrilateral as a rectangle from center point \a center 118 : : * and another point \a point. 119 : : * Z is taken from \a center point. 120 : : * \param center center point 121 : : * \param point corner point 122 : : */ 123 : : static QgsQuadrilateral rectangleFromCenterPoint( const QgsPoint ¢er, const QgsPoint &point ) SIP_HOLDGIL; 124 : : 125 : : /** 126 : : * Construct a QgsQuadrilateral as a rectangle from a QgsRectangle. 127 : : * \param rectangle rectangle 128 : : */ 129 : : static QgsQuadrilateral fromRectangle( const QgsRectangle &rectangle ) SIP_HOLDGIL; 130 : : 131 : : // TODO: 132 : : // Rhombus 133 : : 134 : : /** 135 : : * Compares two QgsQuadrilateral, allowing specification of the maximum allowable difference between points. 136 : : * \param other the QgsQuadrilateral to compare 137 : : * \param epsilon the maximum difference allowed / tolerance 138 : : */ 139 : : bool equals( const QgsQuadrilateral &other, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const SIP_HOLDGIL; 140 : : bool operator==( const QgsQuadrilateral &other ) const SIP_HOLDGIL; 141 : : bool operator!=( const QgsQuadrilateral &other ) const SIP_HOLDGIL; 142 : : 143 : : /** 144 : : * Convenient method to determine if a QgsQuadrilateral is valid. 145 : : * A QgsQuadrilateral must be simple (not self-intersecting) and 146 : : * cannot have collinear points. 147 : : */ 148 : : bool isValid() const SIP_HOLDGIL; 149 : : 150 : : /** 151 : : * Simple enumeration to ensure indices in setPoint 152 : : */ 153 : : enum Point 154 : : { 155 : : Point1, 156 : : Point2, 157 : : Point3, 158 : : Point4, 159 : : }; 160 : : 161 : : /** 162 : : * Sets the point \a newPoint at the \a index. 163 : : * Returns FALSE if the QgsQuadrilateral is not valid. 164 : : * \see Point 165 : : */ 166 : : bool setPoint( const QgsPoint &newPoint, Point index ) SIP_HOLDGIL; 167 : : 168 : : /** 169 : : * Set all points 170 : : * Returns FALSE if the QgsQuadrilateral is not valid: 171 : : * 172 : : * - The points do not have the same type 173 : : * - The quadrilateral would have auto intersections 174 : : * - The quadrilateral has double points 175 : : * - The quadrilateral has collinear points 176 : : */ 177 : : bool setPoints( const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, const QgsPoint &p4 ) SIP_HOLDGIL; 178 : : 179 : : /** 180 : : * Returns a list including the vertices of the quadrilateral. 181 : : */ 182 : : QgsPointSequence points() const; 183 : : 184 : : /** 185 : : * Returns the quadrilateral as a new polygon. Ownership is transferred to the caller. 186 : : */ 187 : : QgsPolygon *toPolygon( bool force2D = false ) const SIP_FACTORY; 188 : : 189 : : /** 190 : : * Returns the quadrilateral as a new linestring. Ownership is transferred to the caller. 191 : : */ 192 : : QgsLineString *toLineString( bool force2D = false ) const SIP_FACTORY; 193 : : 194 : : /** 195 : : * Returns a string representation of the quadrilateral. 196 : : * Members will be truncated to the specified precision. 197 : : */ 198 : : QString toString( int pointPrecision = 17 ) const; 199 : : 200 : : /** 201 : : * Returns the area of the quadrilateral, or 0 if the quadrilateral is empty. 202 : : */ 203 : : double area() const SIP_HOLDGIL; 204 : : 205 : : /** 206 : : * Returns the perimeter of the quadrilateral, or 0 if the quadrilateral is empty. 207 : : */ 208 : : double perimeter() const SIP_HOLDGIL; 209 : : #ifdef SIP_RUN 210 : : SIP_PYOBJECT __repr__(); 211 : : % MethodCode 212 : : QString str = QStringLiteral( "<QgsQuadrilateral: %1>" ).arg( sipCpp->toString() ); 213 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 214 : : % End 215 : : #endif 216 : : private: 217 : : QgsPoint mPoint1, mPoint2, mPoint3, mPoint4; 218 : : }; 219 : : 220 : : #endif // QGSQUADRILATERAL_H