QGIS API Documentation 3.99.0-Master (21b3aa880ba)
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
31class CORE_EXPORT QgsGeometryUtilsBase
32{
33 public:
34
41 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 ); }
42
49 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 ) ); }
50
54 static double sqrDistance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
55
59 static double distance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return std::sqrt( sqrDistance2D( x1, y1, x2, y2 ) ); }
60
64 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;
65
73 static int leftOfLine( const double x, const double y, const double x1, const double y1, const double x2, const double y2 ) SIP_HOLDGIL;
74
84 static void pointOnLineWithDistance( double x1, double y1, double x2, double y2, double distance, double &x, double &y,
85 double *z1 = nullptr, double *z2 = nullptr, double *z = nullptr,
86 double *m1 = nullptr, double *m2 = nullptr, double *m = nullptr ) SIP_SKIP;
87
115 static void perpendicularOffsetPointAlongSegment( double x1, double y1, double x2, double y2, double proportion, double offset, double *x SIP_OUT, double *y SIP_OUT );
116
118 static double ccwAngle( double dy, double dx ) SIP_HOLDGIL;
119
121 static void circleCenterRadius( double x1, double y1, double x2, double y2, double x3, double y3, double &radius SIP_OUT,
122 double &centerX SIP_OUT, double &centerY SIP_OUT ) SIP_HOLDGIL;
123
130 static bool circleClockwise( double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
131
133 static bool circleAngleBetween( double angle, double angle1, double angle2, bool clockwise ) SIP_HOLDGIL;
134
139 static bool angleOnCircle( double angle, double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
140
142 static double circleLength( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
143
165 static double calculateArcLength( double centerX, double centerY, double radius,
166 double x1, double y1, double x2, double y2,
167 double x3, double y3, int fromVertex, int toVertex ) SIP_HOLDGIL;
168
170 static double sweepAngle( double centerX, double centerY, double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
171
175 static double interpolateArcValue( double angle, double a1, double a2, double a3, double zm1, double zm2, double zm3 ) SIP_HOLDGIL;
176
182 static double normalizedAngle( double angle ) SIP_HOLDGIL;
183
192 static double lineAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
193
205 static double angleBetweenThreePoints( double x1, double y1, double x2, double y2,
206 double x3, double y3 ) SIP_HOLDGIL;
207
217 static double linePerpendicularAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
218
223 static double averageAngle( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
224
231 static double averageAngle( double a1, double a2 ) SIP_HOLDGIL;
232
255 static int closestSideOfRectangle( double right, double bottom, double left, double top, double x, double y );
256
279
280 static void perpendicularCenterSegment( double centerPointX, double centerPointY,
281 double segmentPoint1x, double segmentPoint1y,
282 double segmentPoint2x, double segmentPoint2y,
283 double &perpendicularSegmentPoint1x SIP_OUT, double &perpendicularSegmentPoint1y SIP_OUT,
284 double &perpendicularSegmentPoint2x SIP_OUT, double &perpendicularSegmentPoint2y SIP_OUT,
285 double segmentLength = 0
286 ) SIP_HOLDGIL;
287
296 static double skewLinesDistance( const QgsVector3D &P1, const QgsVector3D &P12,
297 const QgsVector3D &P2, const QgsVector3D &P22 ) SIP_HOLDGIL;
298
309 static bool skewLinesProjection( const QgsVector3D &P1, const QgsVector3D &P12,
310 const QgsVector3D &P2, const QgsVector3D &P22,
312 double epsilon = 0.0001 ) SIP_HOLDGIL;
313
350 static bool linesIntersection3D( const QgsVector3D &La1, const QgsVector3D &La2,
351 const QgsVector3D &Lb1, const QgsVector3D &Lb2,
352 QgsVector3D &intersection SIP_OUT ) SIP_HOLDGIL;
353
360 static double triangleArea( double aX, double aY, double bX, double bY, double cX, double cY ) SIP_HOLDGIL;
361
370 static double pointFractionAlongLine( double x1, double y1, double x2, double y2, double px, double py );
371
389 static void weightedPointInTriangle( double aX, double aY, double bX, double bY, double cX, double cY,
390 double weightB, double weightC, double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
391
398 static bool pointsAreCollinear( double x1, double y1, double x2, double y2, double x3, double y3, double epsilon );
399
420
421 static bool angleBisector( double aX, double aY, double bX, double bY, double cX, double cY, double dX, double dY,
422 double &pointX SIP_OUT, double &pointY SIP_OUT, double &angle SIP_OUT ) SIP_HOLDGIL;
423
440 static bool bisector( double aX, double aY, double bX, double bY, double cX, double cY,
441 double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
442
443
458 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;
459
478 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;
479
498 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;
499
508 static double azimuth( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
509
510#ifndef SIP_RUN
511
531 template<typename T, typename... Args>
532 static bool fuzzyEqual( T epsilon, const Args &... args ) noexcept
533 {
534 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) != 0 ), "The number of arguments must be greater than 0 and even" );
535 constexpr size_t numArgs = sizeof...( args );
536 bool result = true;
537 T values[] = {static_cast<T>( args )...};
538
539 for ( size_t i = 0; i < numArgs / 2; ++i )
540 {
541 result = result && qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
542 }
543
544 return result;
545 }
546
567 template<typename T, typename... Args>
568 static bool fuzzyDistanceEqual( T epsilon, const Args &... args ) noexcept
569 {
570 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) >= 4 ), "The number of arguments must be greater than 4 and even" );
571 constexpr size_t numArgs = sizeof...( args );
572 const T squaredEpsilon = epsilon * epsilon;
573 T sum = 0;
574
575 T values[] = {static_cast<T>( args )...};
576
577 for ( size_t i = 0; i < numArgs / 2; ++i )
578 {
579 const T diff = values[i] - values[i + numArgs / 2];
580 sum += diff * diff;
581 }
582
583 return sum < squaredEpsilon;
584 }
585
602 static double maxFilletRadius( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
603 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
604 double epsilon = 1e-8 ) SIP_HOLDGIL;
605
641 static bool createChamfer( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
642 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
643 const double distance1, const double distance2,
644 double &chamferStartX, double &chamferStartY,
645 double &chamferEndX, double &chamferEndY,
646 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
647 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
648 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
649 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
650 const double epsilon = 1e-8 );
651
687 static bool createFillet( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
688 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
689 const double radius,
690 double *filletPointsX, double *filletPointsY,
691 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
692 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
693 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
694 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
695 const double epsilon = 1e-8 );
696#endif
697};
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 bool fuzzyEqual(T epsilon, const Args &... args) noexcept
Performs fuzzy comparison between pairs of values within a specified epsilon.
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:30
Represent a 2-dimensional vector.
Definition qgsvector.h:31
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:6589
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_HOLDGIL
Definition qgis_sip.h:179