38 double z = std::numeric_limits< double >::quiet_NaN();
39 double m = std::numeric_limits< double >::quiet_NaN();
51 if ( p2.
is3D() && std::isnan( z ) )
53 if ( p3.
is3D() && std::isnan( z ) )
55 if ( !std::isnan( z ) )
66 const QgsPoint point1( pType, p1.
x(), p1.
y(), std::isnan( p1.
z() ) ? z : p1.
z() );
67 const QgsPoint point2( pType, p2.
x(), p2.
y(), std::isnan( p2.
z() ) ? z : p2.
z() );
68 const QgsPoint point3( pType, p3.
x(), p3.
y(), std::isnan( p3.
z() ) ? z : p3.
z() );
71 double inclination = 90.0;
78 if ( point2.
is3D() && point3.
is3D() )
85 distance = point2.
distance( point3 );
93 QgsVector3D( point2.
x(), point2.
y(), std::isnan( point2.
z() ) ? z : point2.
z() ),
94 QgsVector3D( point3.
x(), point3.
y(), std::isnan( point3.
z() ) ? z : point3.
z() ) );
95 const QgsPoint pV3( pType, v3.
x(), v3.
y(), v3.
z() );
122 if ( !std::isnan( m ) )
141 const double z = p1.
z();
142 const double m = p1.
m();
144 double xMin = 0, xMax = 0, yMin = 0, yMax = 0;
146 if ( p1.
x() < p2.
x() )
158 if ( p1.
y() < p2.
y() )
184 const double z = p1.
z();
185 const double m = p1.
m();
190 const double azimuth = p1.
azimuth( point3 ) + 90.0;
191 const double distance = p1.
distance( point3 ) / 2.0;
194 point2 = midPoint.
project( -distance, azimuth );
195 point4 = midPoint.
project( distance, azimuth );
202 quad.
setPoints( p1, point2, point3, point4 );
211 const double xOffset = std::fabs( point.
x() - center.
x() );
212 const double yOffset = std::fabs( point.
y() - center.
y() );
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() ) );
234static bool equalPoint(
const QgsPoint &p1,
const QgsPoint &p2,
double epsilon )
240 equal &=
qgsDoubleNear( p1.
z(), p2.
z(), epsilon ) || ( std::isnan( p1.
z() ) && std::isnan( p2.
z() ) );
242 equal &=
qgsDoubleNear( p1.
m(), p2.
m(), epsilon ) || ( std::isnan( p1.
m() ) && std::isnan( p2.
m() ) );
257 return ( ( equalPoint( mPoint1, other.mPoint1, epsilon ) ) &&
258 ( equalPoint( mPoint2, other.mPoint2, epsilon ) ) &&
259 ( equalPoint( mPoint3, other.mPoint3, epsilon ) ) &&
260 ( equalPoint( mPoint4, other.mPoint4, epsilon ) ) );
289 return !( isIntersection1234 || isIntersection2341 );
294 const bool isCollinear =
308 const bool doublePoints =
310 ( p1 == p2 ) || ( p1 == p3 ) || ( p1 == p4 ) || ( p2 == p3 ) || ( p2 == p4 ) || ( p3 == p4 ) );
312 return !doublePoints;
324 haveSameType( p1, p2, p3, p4 ) &&
325 notHaveDoublePoints( p1, p2, p3, p4 ) &&
326 isNotAntiParallelogram( p1, p2, p3, p4 ) &&
327 isNotCollinear( p1, p2, p3, p4 )
333 return validate( mPoint1, mPoint2, mPoint3, mPoint4 );
341 if ( validate( newPoint, mPoint2, mPoint3, mPoint4 ) ==
false )
346 if ( validate( mPoint1, newPoint, mPoint3, mPoint4 ) ==
false )
351 if ( validate( mPoint1, mPoint2, newPoint, mPoint4 ) ==
false )
356 if ( validate( mPoint1, mPoint2, mPoint3, newPoint ) ==
false )
367 if ( validate( p1, p2, p3, p4 ) ==
false )
382 pts << mPoint1 << mPoint2 << mPoint3 << mPoint4 << mPoint1;
389 auto polygon = std::make_unique< QgsPolygon >();
392 return polygon.release();
397 return polygon.release();
402 auto ext = std::make_unique< QgsLineString>();
405 return ext.release();
411 ext->setPoints( pts );
419 return ext.release();
426 rep = QStringLiteral(
"Empty" );
428 rep = QStringLiteral(
"Quadrilateral (Point 1: %1, Point 2: %2, Point 3: %3, Point 4: %4)" )
429 .arg( mPoint1.asWkt( pointPrecision ), 0,
's' )
430 .arg( mPoint2.asWkt( pointPrecision ), 0,
's' )
431 .arg( mPoint3.asWkt( pointPrecision ), 0,
's' )
432 .arg( mPoint4.asWkt( pointPrecision ), 0,
's' );
439 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
440 return polygon->area();
445 std::unique_ptr<QgsPolygon> polygon(
toPolygon() );
446 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