16#ifndef QGSGEOMETRYUTILS_H
17#define QGSGEOMETRYUTILS_H
94 static double sqrDistToLine(
double ptX,
double ptY,
double x1,
double y1,
double x2,
double y2,
double &minDistX
SIP_OUT,
double &minDistY
SIP_OUT,
double epsilon )
SIP_HOLDGIL;
104 static double distToInfiniteLine(
const QgsPoint &point,
const QgsPoint &linePoint1,
const QgsPoint &linePoint2,
double epsilon = 1e-7 );
168 static bool lineCircleIntersection(
const QgsPointXY ¢er,
double radius,
182 static int circleCircleIntersections(
const QgsPointXY ¢er1,
double radius1,
194 static bool tangentPointAndCircle(
const QgsPointXY ¢er,
double radius,
214 static int circleCircleOuterTangents(
237 static int circleCircleInnerTangents(
251 const double nx = s2.
y() - s1.y();
252 const double ny = -( s2.x() - s1.x() );
253 const double t = ( p.
x() * ny - p.
y() * nx - s1.x() * ny + s1.y() * nx ) / ( ( s2.x() - s1.x() ) * ny - ( s2.y() - s1.y() ) * nx );
254 return t < 0. ? s1 : t > 1. ? s2 :
QgsPoint( s1.x() + ( s2.x() - s1.x() ) * t, s1.y() + ( s2.y() - s1.y() ) * t );
275 static QVector<SelfIntersection> selfIntersections(
const QgsAbstractGeometry *geom,
int part,
int ring,
double tolerance )
SIP_SKIP;
284 static int leftOfLine(
const double x,
const double y,
const double x1,
const double y1,
const double x2,
const double y2 )
SIP_HOLDGIL;
311 static void pointOnLineWithDistance(
double x1,
double y1,
double x2,
double y2,
double distance,
double &x,
double &y,
312 double *z1 =
nullptr,
double *z2 =
nullptr,
double *z =
nullptr,
313 double *m1 =
nullptr,
double *m2 =
nullptr,
double *m =
nullptr )
SIP_SKIP;
342 static
void perpendicularOffsetPointAlongSegment(
double x1,
double y1,
double x2,
double y2,
double proportion,
double offset,
double *x
SIP_OUT,
double *y
SIP_OUT );
355 static
double ccwAngle(
double dy,
double dx )
SIP_HOLDGIL;
367 static
bool circleClockwise(
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
370 static
bool circleAngleBetween(
double angle,
double angle1,
double angle2,
bool clockwise )
SIP_HOLDGIL;
376 static
bool angleOnCircle(
double angle,
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
379 static
double circleLength(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
382 static
double sweepAngle(
double centerX,
double centerY,
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
415 bool hasZ = false,
bool hasM = false );
446 static
double interpolateArcValue(
double angle,
double a1,
double a2,
double a3,
double zm1,
double zm2,
double zm3 )
SIP_HOLDGIL;
495 static
double normalizedAngle(
double angle )
SIP_HOLDGIL;
505 static
double lineAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
518 static
double angleBetweenThreePoints(
double x1,
double y1,
double x2,
double y2,
530 static
double linePerpendicularAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
536 static
double averageAngle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
544 static
double averageAngle(
double a1,
double a2 )
SIP_HOLDGIL;
550 static QPair<
Qgis::WkbType, QString> wktReadBlock( const QString &wkt )
SIP_SKIP;
559 static QStringList wktGetChildBlocks( const QString &wkt, const QString &defaultType = QString() )
SIP_SKIP;
583 static
int closestSideOfRectangle(
double right,
double bottom,
double left,
double top,
double x,
double y );
623 static
QgsPointXY interpolatePointOnLine(
double x1,
double y1,
double x2,
double y2,
double fraction )
SIP_HOLDGIL;
655 static
QgsPointXY interpolatePointOnLineByValue(
double x1,
double y1,
double v1,
double x2,
double y2,
double v2,
double value )
SIP_HOLDGIL;
710 static
void perpendicularCenterSegment(
double centerPointX,
double centerPointY,
711 double segmentPoint1x,
double segmentPoint1y,
712 double segmentPoint2x,
double segmentPoint2y,
713 double &perpendicularSegmentPoint1x
SIP_OUT,
double &perpendicularSegmentPoint1y
SIP_OUT,
714 double &perpendicularSegmentPoint2x
SIP_OUT,
double &perpendicularSegmentPoint2y
SIP_OUT,
715 double segmentLength = 0
790 static
double triangleArea(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY )
SIP_HOLDGIL;
800 static
double pointFractionAlongLine(
double x1,
double y1,
double x2,
double y2,
double px,
double py );
819 static
void weightedPointInTriangle(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
828 static
bool pointsAreCollinear(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double epsilon );
848 return transferFirstZValueToPoint( points, point );
908 for (
auto it = verticesBegin ; it != verticesEnd ; ++it )
910 if ( !mFound && ( *it ).isMeasure() )
913 point.
setM( ( *it ).m() );
916 if ( !zFound && ( *it ).is3D() )
919 point.
setZ( ( *it ).z() );
922 if ( zFound && mFound )
926 return zFound || mFound;
992 static bool angleBisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
double dX,
double dY,
1011 static bool bisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
1025 double minDist = std::numeric_limits<double>::max();
1026 double minDistSegmentX = 0.0, minDistSegmentY = 0.0;
1028 int minDistLeftOf = 0;
1029 double sqrDist = 0.0;
1030 int vertexOffset = 0;
1034 for (
int i = 0; i < container.size(); ++i )
1036 sqrDist = container.at( i )->closestSegment( pt, segmentPt, vertexAfter, leftOf, epsilon );
1037 if ( sqrDist >= 0 && sqrDist < minDist )
1040 minDistSegmentX = segmentPt.x();
1041 minDistSegmentY = segmentPt.y();
1042 minDistVertexAfter = vertexAfter;
1043 minDistVertexAfter.
vertex = vertexAfter.vertex + vertexOffset;
1044 minDistVertexAfter.
part = vertexAfter.part + partOffset;
1045 minDistVertexAfter.
ring = vertexAfter.ring + ringOffset;
1048 minDistLeftOf = *leftOf;
1052 if ( ctype == Vertex )
1055 vertexOffset += container.at( i )->nCoordinates() - 1;
1057 else if ( ctype == Ring )
1061 else if ( ctype == Part )
1067 if ( minDist == std::numeric_limits<double>::max() )
1070 segmentPt.setX( minDistSegmentX );
1071 segmentPt.setY( minDistSegmentY );
1072 vertexAfter = minDistVertexAfter;
1075 *leftOf = minDistLeftOf;
The Qgis class provides global constants for use throughout the application.
Abstract base class for all geometries.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
Contains various geometry utility functions.
static bool transferFirstZOrMValueToPoint(const QgsPointSequence &points, QgsPoint &point)
A Z or M dimension is added to point if one of the points in the list points contains Z or M value.
static QgsPoint projectPointOnSegment(const QgsPoint &p, const QgsPoint &s1, const QgsPoint &s2)
Project the point on a segment.
static bool transferFirstZOrMValueToPoint(const QgsGeometry &geom, QgsPoint &point)
A Z or M dimension is added to point if one of the points in the list points contains Z or M value.
static double closestSegmentFromComponents(T &container, ComponentType ctype, const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf, double epsilon)
static bool transferFirstZOrMValueToPoint(Iterator verticesBegin, Iterator verticesEnd, QgsPoint &point)
A Z or M dimension is added to point if one of the points in the list points contains Z or M value.
A geometry is the spatial representation of a feature.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
Line string geometry type, with support for z-dimension and m-values.
A class to represent a 2D point.
Point geometry type, with support for z-dimension and m-values.
void setM(double m)
Sets the point's m-value.
bool convertTo(Qgis::WkbType type) override
Converts the geometry to a specified type.
void setZ(double z)
Sets the point's z-coordinate.
Class for storage of 3D vectors similar to QVector3D, with the difference that it uses double precisi...
A class to represent a vector.
static Qgis::WkbType addM(Qgis::WkbType type)
Adds the m dimension to a WKB type and returns the new type.
static Qgis::WkbType addZ(Qgis::WkbType type)
Adds the z dimension to a WKB type and returns the new type.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define SIP_PYALTERNATIVETYPE(type)
QVector< QgsPoint > QgsPointSequence
Utility class for identifying a unique vertex within a geometry.