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.