QGIS API Documentation 3.99.0-Master (8e76e220402)
Loading...
Searching...
No Matches
qgsgeometryutils_base.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsgeometryutils_base.h
3 -------------------------------------------------------------------
4Date : 14 september 2023
5Copyright : (C) 2023 by Loïc Bartoletti
6email : loic dot bartoletti at oslandia dot com
7***************************************************************************
8* *
9* This program is free software; you can redistribute it and/or modify *
10* it under the terms of the GNU General Public License as published by *
11* the Free Software Foundation; either version 2 of the License, or *
12* (at your option) any later version. *
13* *
14***************************************************************************/
15
16#pragma once
17
18#include <iterator>
19
20#include "qgis_core.h"
21#include "qgis_sip.h"
22#include "qgsvector.h"
23#include "qgsvector3d.h"
24
35class CORE_EXPORT QgsGeometryUtilsBase
36{
37 public:
38
45 static double sqrDistance3D( double x1, double y1, double z1, double x2, double y2, double z2 ) SIP_HOLDGIL {return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ) + ( z1 - z2 ) * ( z1 - z2 ); }
46
53 static double distance3D( double x1, double y1, double z1, double x2, double y2, double z2 ) SIP_HOLDGIL {return std::sqrt( sqrDistance3D( x1, y1, z1, x2, y2, z2 ) ); }
54
58 static double sqrDistance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
59
63 static double distance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return std::sqrt( sqrDistance2D( x1, y1, x2, y2 ) ); }
64
68 static double sqrDistance2D( QPointF point1, QPointF point2 ) SIP_HOLDGIL {return sqrDistance2D( point1.x(), point1.y(), point2.x(), point2.y() ); }
69
73 static double distance2D( QPointF point1, QPointF point2 ) SIP_HOLDGIL {return distance2D( point1.x(), point1.y(), point2.x(), point2.y() );}
74
78 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;
79
87 static int leftOfLine( const double x, const double y, const double x1, const double y1, const double x2, const double y2 ) SIP_HOLDGIL;
88
98 static void pointOnLineWithDistance( double x1, double y1, double x2, double y2, double distance, double &x, double &y,
99 double *z1 = nullptr, double *z2 = nullptr, double *z = nullptr,
100 double *m1 = nullptr, double *m2 = nullptr, double *m = nullptr ) SIP_SKIP;
101
135 static void interpolatePointOnCubicBezier(
136 double p0x, double p0y, double p0z, double p0m,
137 double p1x, double p1y, double p1z, double p1m,
138 double p2x, double p2y, double p2z, double p2m,
139 double p3x, double p3y, double p3z, double p3m,
140 double t, bool hasZ, bool hasM,
141 double &outX, double &outY, double &outZ, double &outM ) SIP_SKIP;
142
170 static void perpendicularOffsetPointAlongSegment( double x1, double y1, double x2, double y2, double proportion, double offset, double *x SIP_OUT, double *y SIP_OUT );
171
173 static double ccwAngle( double dy, double dx ) SIP_HOLDGIL;
174
176 static void circleCenterRadius( double x1, double y1, double x2, double y2, double x3, double y3, double &radius SIP_OUT,
177 double &centerX SIP_OUT, double &centerY SIP_OUT ) SIP_HOLDGIL;
178
185 static bool circleClockwise( double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
186
188 static bool circleAngleBetween( double angle, double angle1, double angle2, bool clockwise ) SIP_HOLDGIL;
189
194 static bool angleOnCircle( double angle, double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
195
197 static double circleLength( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
198
220 static double calculateArcLength( double centerX, double centerY, double radius,
221 double x1, double y1, double x2, double y2,
222 double x3, double y3, int fromVertex, int toVertex ) SIP_HOLDGIL;
223
225 static double sweepAngle( double centerX, double centerY, double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
226
230 static double interpolateArcValue( double angle, double a1, double a2, double a3, double zm1, double zm2, double zm3 ) SIP_HOLDGIL;
231
237 static double normalizedAngle( double angle ) SIP_HOLDGIL;
238
247 static double lineAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
248
260 static double angleBetweenThreePoints( double x1, double y1, double x2, double y2,
261 double x3, double y3 ) SIP_HOLDGIL;
262
272 static double linePerpendicularAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
273
278 static double averageAngle( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
279
286 static double averageAngle( double a1, double a2 ) SIP_HOLDGIL;
287
310 static int closestSideOfRectangle( double right, double bottom, double left, double top, double x, double y );
311
334
335 static void perpendicularCenterSegment( double centerPointX, double centerPointY,
336 double segmentPoint1x, double segmentPoint1y,
337 double segmentPoint2x, double segmentPoint2y,
338 double &perpendicularSegmentPoint1x SIP_OUT, double &perpendicularSegmentPoint1y SIP_OUT,
339 double &perpendicularSegmentPoint2x SIP_OUT, double &perpendicularSegmentPoint2y SIP_OUT,
340 double segmentLength = 0
341 ) SIP_HOLDGIL;
342
351 static double skewLinesDistance( const QgsVector3D &P1, const QgsVector3D &P12,
352 const QgsVector3D &P2, const QgsVector3D &P22 ) SIP_HOLDGIL;
353
364 static bool skewLinesProjection( const QgsVector3D &P1, const QgsVector3D &P12,
365 const QgsVector3D &P2, const QgsVector3D &P22,
367 double epsilon = 0.0001 ) SIP_HOLDGIL;
368
405 static bool linesIntersection3D( const QgsVector3D &La1, const QgsVector3D &La2,
406 const QgsVector3D &Lb1, const QgsVector3D &Lb2,
407 QgsVector3D &intersection SIP_OUT ) SIP_HOLDGIL;
408
415 static double triangleArea( double aX, double aY, double bX, double bY, double cX, double cY ) SIP_HOLDGIL;
416
425 static double pointFractionAlongLine( double x1, double y1, double x2, double y2, double px, double py );
426
444 static void weightedPointInTriangle( double aX, double aY, double bX, double bY, double cX, double cY,
445 double weightB, double weightC, double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
446
453 static bool pointsAreCollinear( double x1, double y1, double x2, double y2, double x3, double y3, double epsilon );
454
461 static bool points3DAreCollinear( double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double epsilon );
462
483
484 static bool angleBisector( double aX, double aY, double bX, double bY, double cX, double cY, double dX, double dY,
485 double &pointX SIP_OUT, double &pointY SIP_OUT, double &angle SIP_OUT ) SIP_HOLDGIL;
486
503 static bool bisector( double aX, double aY, double bX, double bY, double cX, double cY,
504 double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
505
506
521 static bool lineIntersection( double p1x, double p1y, QgsVector v1, double p2x, double p2y, QgsVector v2, double &intersectionX SIP_OUT, double &intersectionY SIP_OUT ) SIP_HOLDGIL;
522
545 static bool intersectionPointOfLinesByBearing( double x1, double y1, double bearing1,
546 double x2, double y2, double bearing2,
547 double &intersectionX SIP_OUT, double &intersectionY SIP_OUT ) SIP_HOLDGIL;
548
567 static bool segmentIntersection( double p1x, double p1y, double p2x, double p2y, double q1x, double q1y, double q2x, double q2y, double &intersectionPointX SIP_OUT, double &intersectionPointY SIP_OUT, bool &isIntersection SIP_OUT, double tolerance = 1e-8, bool acceptImproperIntersection = false ) SIP_HOLDGIL;
568
587 static void project( double aX, double aY, double aZ, double distance, double azimuth, double inclination, double &resultX SIP_OUT, double &resultY SIP_OUT, double &resultZ SIP_OUT ) SIP_HOLDGIL;
588
597 static double azimuth( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
598
599#ifndef SIP_RUN
600
620 template<typename T, typename... Args>
621 static bool fuzzyEqual( T epsilon, const Args &... args ) noexcept
622 {
623 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) != 0 ), "The number of arguments must be greater than 0 and even" );
624 constexpr size_t numArgs = sizeof...( args );
625 bool result = true;
626 T values[] = {static_cast<T>( args )...};
627
628 for ( size_t i = 0; i < numArgs / 2; ++i )
629 {
630 result = result && qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
631 }
632
633 return result;
634 }
635
656 template<typename T, typename... Args>
657 static bool fuzzyDistanceEqual( T epsilon, const Args &... args ) noexcept
658 {
659 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) >= 4 ), "The number of arguments must be greater than 4 and even" );
660 constexpr size_t numArgs = sizeof...( args );
661 const T squaredEpsilon = epsilon * epsilon;
662 T sum = 0;
663
664 T values[] = {static_cast<T>( args )...};
665
666 for ( size_t i = 0; i < numArgs / 2; ++i )
667 {
668 const T diff = values[i] - values[i + numArgs / 2];
669 sum += diff * diff;
670 }
671
672 return sum < squaredEpsilon;
673 }
674
691 static double maximumFilletRadius( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY, const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY, double epsilon = 1e-8 ) SIP_HOLDGIL;
692
728 static bool createChamfer( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
729 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
730 const double distance1, const double distance2,
731 double &chamferStartX, double &chamferStartY,
732 double &chamferEndX, double &chamferEndY,
733 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
734 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
735 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
736 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
737 const double epsilon = 1e-8 );
738
774 static bool createFillet( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
775 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
776 const double radius,
777 double *filletPointsX, double *filletPointsY,
778 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
779 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
780 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
781 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
782 const double epsilon = 1e-8 );
783#endif
784};
Convenience functions for geometry utils.
static double sqrDistance2D(double x1, double y1, double x2, double y2)
Returns the squared 2D distance between (x1, y1) and (x2, y2).
static double distance2D(double x1, double y1, double x2, double y2)
Returns the 2D distance between (x1, y1) and (x2, y2).
static double sqrDistance2D(QPointF point1, QPointF point2)
Returns the squared 2D distance between point1 and point2.
static bool fuzzyEqual(T epsilon, const Args &... args) noexcept
Performs fuzzy comparison between pairs of values within a specified epsilon.
static double distance2D(QPointF point1, QPointF point2)
Returns the 2D distance between point1 and point2.
static double distance3D(double x1, double y1, double z1, double x2, double y2, double z2)
Returns the 3D distance between (x1, y1, z1) and (x2, y2, z2).
static double sqrDistance3D(double x1, double y1, double z1, double x2, double y2, double z2)
Returns the squared 3D distance between (x1, y1, z1) and (x2, y2, z2).
static bool fuzzyDistanceEqual(T epsilon, const Args &... args) noexcept
Compare equality between multiple pairs of values with a specified epsilon.
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
Definition qgsvector3d.h:33
Represent a 2-dimensional vector.
Definition qgsvector.h:34
bool qgsNumberNear(T a, T b, T epsilon=std::numeric_limits< T >::epsilon() *4)
Compare two numbers of type T (but allow some difference).
Definition qgis.h:6917
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_HOLDGIL
Definition qgis_sip.h:179