24using namespace Qt::StringLiterals;
42 double z = std::numeric_limits< double >::quiet_NaN();
43 double m = std::numeric_limits< double >::quiet_NaN();
55 if ( p2.
is3D() && std::isnan( z ) )
57 if ( p3.
is3D() && std::isnan( z ) )
59 if ( !std::isnan( z ) )
70 const QgsPoint point1( pType, p1.
x(), p1.
y(), std::isnan( p1.
z() ) ? z : p1.
z() );
71 const QgsPoint point2( pType, p2.
x(), p2.
y(), std::isnan( p2.
z() ) ? z : p2.
z() );
72 const QgsPoint point3( pType, p3.
x(), p3.
y(), std::isnan( p3.
z() ) ? z : p3.
z() );
75 double inclination = 90.0;
82 if ( point2.
is3D() && point3.
is3D() )
89 distance = point2.
distance( point3 );
97 QgsVector3D( point1.
x(), point1.
y(), std::isnan( point1.
z() ) ? z : point1.
z() ),
98 QgsVector3D( point2.
x(), point2.
y(), std::isnan( point2.
z() ) ? z : point2.
z() ),
99 QgsVector3D( point3.
x(), point3.
y(), std::isnan( point3.
z() ) ? z : point3.
z() )
101 const QgsPoint pV3( pType, v3.
x(), v3.
y(), v3.
z() );
128 if ( !std::isnan( m ) )
146 const double z = p1.
z();
147 const double m = p1.
m();
149 double xMin = 0, xMax = 0, yMin = 0, yMax = 0;
151 if ( p1.
x() < p2.
x() )
162 if ( p1.
y() < p2.
y() )
173 quad.
setPoints(
QgsPoint( p1.
wkbType(), xMin, yMin, z, m ),
QgsPoint( p1.
wkbType(), xMin, yMax, z, m ),
QgsPoint( p1.
wkbType(), xMax, yMax, z, m ),
QgsPoint( p1.
wkbType(), xMax, yMin, z, m ) );
183 const double z = p1.
z();
184 const double m = p1.
m();
189 const double azimuth = p1.
azimuth( point3 ) + 90.0;
190 const double distance = p1.
distance( point3 ) / 2.0;
193 point2 = midPoint.
project( -distance, azimuth );
194 point4 = midPoint.
project( distance, azimuth );
201 quad.
setPoints( p1, point2, point3, point4 );
210 const double xOffset = std::fabs( point.
x() - center.
x() );
211 const double yOffset = std::fabs( point.
y() - center.
y() );
214 QgsPoint( center.
wkbType(), center.
x() - xOffset, center.
y() - yOffset, center.
z(), center.
m() ),
215 QgsPoint( center.
wkbType(), center.
x() - xOffset, center.
y() + yOffset, center.
z(), center.
m() ),
216 QgsPoint( center.
wkbType(), center.
x() + xOffset, center.
y() + yOffset, center.
z(), center.
m() ),
217 QgsPoint( center.
wkbType(), center.
x() + xOffset, center.
y() - yOffset, center.
z(), center.
m() )
235static bool equalPoint(
const QgsPoint &p1,
const QgsPoint &p2,
double epsilon )
241 equal &=
qgsDoubleNear( p1.
z(), p2.
z(), epsilon ) || ( std::isnan( p1.
z() ) && std::isnan( p2.
z() ) );
243 equal &=
qgsDoubleNear( p1.
m(), p2.
m(), epsilon ) || ( std::isnan( p1.
m() ) && std::isnan( p2.
m() ) );
259 ( equalPoint( mPoint1, other.mPoint1, epsilon ) )
260 && ( equalPoint( mPoint2, other.mPoint2, epsilon ) )
261 && ( equalPoint( mPoint3, other.mPoint3, epsilon ) )
262 && ( equalPoint( mPoint4, other.mPoint4, epsilon ) )
292 return !( isIntersection1234 || isIntersection2341 );
297 const bool isCollinear
306 const bool doublePoints = ( ( p1 == p2 ) || ( p1 == p3 ) || ( p1 == p4 ) || ( p2 == p3 ) || ( p2 == p4 ) || ( p3 == p4 ) );
308 return !doublePoints;
319 return ( haveSameType( p1, p2, p3, p4 ) && notHaveDoublePoints( p1, p2, p3, p4 ) && isNotAntiParallelogram( p1, p2, p3, p4 ) && isNotCollinear( p1, p2, p3, p4 ) );
324 return validate( mPoint1, mPoint2, mPoint3, mPoint4 );
332 if ( validate( newPoint, mPoint2, mPoint3, mPoint4 ) ==
false )
337 if ( validate( mPoint1, newPoint, mPoint3, mPoint4 ) ==
false )
342 if ( validate( mPoint1, mPoint2, newPoint, mPoint4 ) ==
false )
347 if ( validate( mPoint1, mPoint2, mPoint3, newPoint ) ==
false )
358 if ( validate( p1, p2, p3, p4 ) ==
false )
373 pts << mPoint1 << mPoint2 << mPoint3 << mPoint4 << mPoint1;
380 auto polygon = std::make_unique< QgsPolygon >();
383 return polygon.release();
388 return polygon.release();
393 auto ext = std::make_unique< QgsLineString>();
396 return ext.release();
402 ext->setPoints( pts );
410 return ext.release();
419 rep = u
"Quadrilateral (Point 1: %1, Point 2: %2, Point 3: %3, Point 4: %4)"_s.arg( mPoint1.asWkt( pointPrecision ), 0,
's' )
420 .arg( mPoint2.asWkt( pointPrecision ), 0,
's' )
421 .arg( mPoint3.asWkt( pointPrecision ), 0,
's' )
422 .arg( mPoint4.asWkt( pointPrecision ), 0,
's' );
429 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
430 return polygon->area();
435 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
436 return polygon->perimeter();
WkbType
The WKB type describes the number of dimensions a geometry has.
bool isMeasure() const
Returns true if the geometry contains m values.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
static int leftOfLine(const double x, const double y, const double x1, const double y1, const double x2, const double y2)
Returns a value < 0 if the point (x, y) is left of the line from (x1, y1) -> (x2, y2).
static bool segmentIntersection(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &q1, const QgsPoint &q2, QgsPoint &intersectionPoint, bool &isIntersection, double tolerance=1e-8, bool acceptImproperIntersection=false)
Compute the intersection between two segments.
static int segmentSide(const QgsPoint &pt1, const QgsPoint &pt3, const QgsPoint &pt2)
For line defined by points pt1 and pt3, find out on which side of the line is point pt2.
static QgsPoint midpoint(const QgsPoint &pt1, const QgsPoint &pt2)
Returns a middle point between points pt1 and pt2.
Line string geometry type, with support for z-dimension and m-values.
Point geometry type, with support for z-dimension and m-values.
double inclination(const QgsPoint &other) const
Calculates Cartesian inclination between this point and other one (starting from zenith = 0 to nadir ...
bool addMValue(double mValue=0) override
Adds a measure to the geometry, initialized to a preset value.
double azimuth(const QgsPoint &other) const
Calculates Cartesian azimuth between this point and other one (clockwise in degree,...
double distance3D(double x, double y, double z) const
Returns the Cartesian 3D distance between this point and a specified x, y, z coordinate.
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
bool dropZValue() override
Drops any z-dimensions which exist in the geometry.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which corresponds to this point projected by a specified distance with specified ...
bool setPoint(const QgsPoint &newPoint, Point index)
Sets the point newPoint at the index.
bool operator!=(const QgsQuadrilateral &other) const
double perimeter() const
Returns the perimeter of the quadrilateral, or 0 if the quadrilateral is empty.
static QgsQuadrilateral fromRectangle(const QgsRectangle &rectangle)
Construct a QgsQuadrilateral as a rectangle from a QgsRectangle.
static QgsQuadrilateral rectangleFromCenterPoint(const QgsPoint ¢er, const QgsPoint &point)
Construct a QgsQuadrilateral as a rectangle from center point center and another point point.
static QgsQuadrilateral rectangleFromExtent(const QgsPoint &p1, const QgsPoint &p2)
Construct a QgsQuadrilateral as a rectangle from an extent, defined by two opposite corner points.
QgsLineString * toLineString(bool force2D=false) const
Returns the quadrilateral as a new linestring.
Point
Simple enumeration to ensure indices in setPoint.
QString toString(int pointPrecision=17) const
Returns a string representation of the quadrilateral.
bool isValid() const
Convenient method to determine if a QgsQuadrilateral is valid.
double area() const
Returns the area of the quadrilateral, or 0 if the quadrilateral is empty.
static QgsQuadrilateral squareFromDiagonal(const QgsPoint &p1, const QgsPoint &p2)
Construct a QgsQuadrilateral as a square from a diagonal.
QgsQuadrilateral()
Constructor for an empty quadrilateral geometry.
bool equals(const QgsQuadrilateral &other, double epsilon=4 *std::numeric_limits< double >::epsilon()) const
Compares two QgsQuadrilateral, allowing specification of the maximum allowable difference between poi...
QgsPolygon * toPolygon(bool force2D=false) const
Returns the quadrilateral as a new polygon.
static QgsQuadrilateral rectangleFrom3Points(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, ConstructionOption mode)
Construct a QgsQuadrilateral as a Rectangle from 3 points.
ConstructionOption
A quadrilateral can be constructed from 3 points where the second distance can be determined by the t...
@ Distance
Second distance is equal to the distance between 2nd and 3rd point.
@ Projected
Second distance is equal to the distance of the perpendicular projection of the 3rd point on the segm...
bool operator==(const QgsQuadrilateral &other) const
QgsPointSequence points() const
Returns a list including the vertices of the quadrilateral.
bool setPoints(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, const QgsPoint &p4)
Set all points Returns false if the QgsQuadrilateral is not valid:
A rectangle specified with double values.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
double x() const
Returns X coordinate.
static QgsVector3D perpendicularPoint(const QgsVector3D &v1, const QgsVector3D &v2, const QgsVector3D &vp)
Returns the perpendicular point of vector vp from [v1 - v2].
static Qgis::WkbType addZ(Qgis::WkbType type)
Adds the z dimension to a WKB type and returns the new type.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QVector< QgsPoint > QgsPointSequence