QGIS API Documentation 3.99.0-Master (a8882ad4560)
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
541 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;
542
561 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;
562
571 static double azimuth( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
572
573#ifndef SIP_RUN
574
594 template<typename T, typename... Args>
595 static bool fuzzyEqual( T epsilon, const Args &... args ) noexcept
596 {
597 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) != 0 ), "The number of arguments must be greater than 0 and even" );
598 constexpr size_t numArgs = sizeof...( args );
599 bool result = true;
600 T values[] = {static_cast<T>( args )...};
601
602 for ( size_t i = 0; i < numArgs / 2; ++i )
603 {
604 result = result && qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
605 }
606
607 return result;
608 }
609
630 template<typename T, typename... Args>
631 static bool fuzzyDistanceEqual( T epsilon, const Args &... args ) noexcept
632 {
633 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) >= 4 ), "The number of arguments must be greater than 4 and even" );
634 constexpr size_t numArgs = sizeof...( args );
635 const T squaredEpsilon = epsilon * epsilon;
636 T sum = 0;
637
638 T values[] = {static_cast<T>( args )...};
639
640 for ( size_t i = 0; i < numArgs / 2; ++i )
641 {
642 const T diff = values[i] - values[i + numArgs / 2];
643 sum += diff * diff;
644 }
645
646 return sum < squaredEpsilon;
647 }
648
665 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;
666
702 static bool createChamfer( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
703 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
704 const double distance1, const double distance2,
705 double &chamferStartX, double &chamferStartY,
706 double &chamferEndX, double &chamferEndY,
707 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
708 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
709 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
710 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
711 const double epsilon = 1e-8 );
712
748 static bool createFillet( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
749 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
750 const double radius,
751 double *filletPointsX, double *filletPointsY,
752 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
753 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
754 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
755 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
756 const double epsilon = 1e-8 );
757#endif
758};
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: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:6870
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_HOLDGIL
Definition qgis_sip.h:179