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( point2.
x(), point2.
y(), std::isnan( point2.
z() ) ? z : point2.
z() ),
98 QgsVector3D( point3.
x(), point3.
y(), std::isnan( point3.
z() ) ? z : point3.
z() ) );
99 const QgsPoint pV3( pType, v3.
x(), v3.
y(), v3.
z() );
126 if ( !std::isnan( m ) )
145 const double z = p1.
z();
146 const double m = p1.
m();
148 double xMin = 0, xMax = 0, yMin = 0, yMax = 0;
150 if ( p1.
x() < p2.
x() )
162 if ( p1.
y() < p2.
y() )
188 const double z = p1.
z();
189 const double m = p1.
m();
194 const double azimuth = p1.
azimuth( point3 ) + 90.0;
195 const double distance = p1.
distance( point3 ) / 2.0;
198 point2 = midPoint.
project( -distance, azimuth );
199 point4 = midPoint.
project( distance, azimuth );
206 quad.
setPoints( p1, point2, point3, point4 );
215 const double xOffset = std::fabs( point.
x() - center.
x() );
216 const double yOffset = std::fabs( point.
y() - center.
y() );
219 QgsPoint( center.
wkbType(), center.
x() - xOffset, center.
y() + yOffset, center.
z(), center.
m() ),
220 QgsPoint( center.
wkbType(), center.
x() + xOffset, center.
y() + yOffset, center.
z(), center.
m() ),
221 QgsPoint( center.
wkbType(), center.
x() + xOffset, center.
y() - yOffset, center.
z(), center.
m() ) );
238static bool equalPoint(
const QgsPoint &p1,
const QgsPoint &p2,
double epsilon )
244 equal &=
qgsDoubleNear( p1.
z(), p2.
z(), epsilon ) || ( std::isnan( p1.
z() ) && std::isnan( p2.
z() ) );
246 equal &=
qgsDoubleNear( p1.
m(), p2.
m(), epsilon ) || ( std::isnan( p1.
m() ) && std::isnan( p2.
m() ) );
261 return ( ( equalPoint( mPoint1, other.mPoint1, epsilon ) ) &&
262 ( equalPoint( mPoint2, other.mPoint2, epsilon ) ) &&
263 ( equalPoint( mPoint3, other.mPoint3, epsilon ) ) &&
264 ( equalPoint( mPoint4, other.mPoint4, epsilon ) ) );
293 return !( isIntersection1234 || isIntersection2341 );
298 const bool isCollinear =
312 const bool doublePoints =
314 ( p1 == p2 ) || ( p1 == p3 ) || ( p1 == p4 ) || ( p2 == p3 ) || ( p2 == p4 ) || ( p3 == p4 ) );
316 return !doublePoints;
328 haveSameType( p1, p2, p3, p4 ) &&
329 notHaveDoublePoints( p1, p2, p3, p4 ) &&
330 isNotAntiParallelogram( p1, p2, p3, p4 ) &&
331 isNotCollinear( p1, p2, p3, p4 )
337 return validate( mPoint1, mPoint2, mPoint3, mPoint4 );
345 if ( validate( newPoint, mPoint2, mPoint3, mPoint4 ) ==
false )
350 if ( validate( mPoint1, newPoint, mPoint3, mPoint4 ) ==
false )
355 if ( validate( mPoint1, mPoint2, newPoint, mPoint4 ) ==
false )
360 if ( validate( mPoint1, mPoint2, mPoint3, newPoint ) ==
false )
371 if ( validate( p1, p2, p3, p4 ) ==
false )
386 pts << mPoint1 << mPoint2 << mPoint3 << mPoint4 << mPoint1;
393 auto polygon = std::make_unique< QgsPolygon >();
396 return polygon.release();
401 return polygon.release();
406 auto ext = std::make_unique< QgsLineString>();
409 return ext.release();
415 ext->setPoints( pts );
423 return ext.release();
432 rep = u
"Quadrilateral (Point 1: %1, Point 2: %2, Point 3: %3, Point 4: %4)"_s
433 .arg( mPoint1.asWkt( pointPrecision ), 0,
's' )
434 .arg( mPoint2.asWkt( pointPrecision ), 0,
's' )
435 .arg( mPoint3.asWkt( pointPrecision ), 0,
's' )
436 .arg( mPoint4.asWkt( pointPrecision ), 0,
's' );
443 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
444 return polygon->area();
449 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
450 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