QGIS API Documentation 4.1.0-Master (60fea48833c)
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 // clang-format off
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 // clang-format on
47
54 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 ) ); }
55
59 static double sqrDistance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
60
64 static double distance2D( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL {return std::sqrt( sqrDistance2D( x1, y1, x2, y2 ) ); }
65
69 static double sqrDistance2D( QPointF point1, QPointF point2 ) SIP_HOLDGIL {return sqrDistance2D( point1.x(), point1.y(), point2.x(), point2.y() ); }
70
74 static double distance2D( QPointF point1, QPointF point2 ) SIP_HOLDGIL {return distance2D( point1.x(), point1.y(), point2.x(), point2.y() );}
75
79 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;
80
88 static int leftOfLine( const double x, const double y, const double x1, const double y1, const double x2, const double y2 ) SIP_HOLDGIL;
89
99 static void pointOnLineWithDistance( double x1, double y1, double x2, double y2, double distance, double &x, double &y,
100 double *z1 = nullptr, double *z2 = nullptr, double *z = nullptr,
101 double *m1 = nullptr, double *m2 = nullptr, double *m = nullptr ) SIP_SKIP;
102
136 static void interpolatePointOnCubicBezier(
137 double p0x, double p0y, double p0z, double p0m,
138 double p1x, double p1y, double p1z, double p1m,
139 double p2x, double p2y, double p2z, double p2m,
140 double p3x, double p3y, double p3z, double p3m,
141 double t, bool hasZ, bool hasM,
142 double &outX, double &outY, double &outZ, double &outM ) SIP_SKIP;
143
171 static void perpendicularOffsetPointAlongSegment( double x1, double y1, double x2, double y2, double proportion, double offset, double *x SIP_OUT, double *y SIP_OUT );
172
174 static double ccwAngle( double dy, double dx ) SIP_HOLDGIL;
175
177 static void circleCenterRadius( double x1, double y1, double x2, double y2, double x3, double y3, double &radius SIP_OUT,
178 double &centerX SIP_OUT, double &centerY SIP_OUT ) SIP_HOLDGIL;
179
186 static bool circleClockwise( double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
187
189 static bool circleAngleBetween( double angle, double angle1, double angle2, bool clockwise ) SIP_HOLDGIL;
190
195 static bool angleOnCircle( double angle, double angle1, double angle2, double angle3 ) SIP_HOLDGIL;
196
198 static double circleLength( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
199
221 static double calculateArcLength( double centerX, double centerY, double radius,
222 double x1, double y1, double x2, double y2,
223 double x3, double y3, int fromVertex, int toVertex ) SIP_HOLDGIL;
224
226 static double sweepAngle( double centerX, double centerY, double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
227
231 static double interpolateArcValue( double angle, double a1, double a2, double a3, double zm1, double zm2, double zm3 ) SIP_HOLDGIL;
232
238 static double normalizedAngle( double angle ) SIP_HOLDGIL;
239
248 static double lineAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
249
261 static double angleBetweenThreePoints( double x1, double y1, double x2, double y2,
262 double x3, double y3 ) SIP_HOLDGIL;
263
273 static double linePerpendicularAngle( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
274
279 static double averageAngle( double x1, double y1, double x2, double y2, double x3, double y3 ) SIP_HOLDGIL;
280
287 static double averageAngle( double a1, double a2 ) SIP_HOLDGIL;
288
311 static int closestSideOfRectangle( double right, double bottom, double left, double top, double x, double y );
312
335
336 static void perpendicularCenterSegment( double centerPointX, double centerPointY,
337 double segmentPoint1x, double segmentPoint1y,
338 double segmentPoint2x, double segmentPoint2y,
339 double &perpendicularSegmentPoint1x SIP_OUT, double &perpendicularSegmentPoint1y SIP_OUT,
340 double &perpendicularSegmentPoint2x SIP_OUT, double &perpendicularSegmentPoint2y SIP_OUT,
341 double segmentLength = 0
342 ) SIP_HOLDGIL;
343
352 static double skewLinesDistance( const QgsVector3D &P1, const QgsVector3D &P12,
353 const QgsVector3D &P2, const QgsVector3D &P22 ) SIP_HOLDGIL;
354
365 static bool skewLinesProjection( const QgsVector3D &P1, const QgsVector3D &P12,
366 const QgsVector3D &P2, const QgsVector3D &P22,
368 double epsilon = 0.0001 ) SIP_HOLDGIL;
369
406 static bool linesIntersection3D( const QgsVector3D &La1, const QgsVector3D &La2,
407 const QgsVector3D &Lb1, const QgsVector3D &Lb2,
408 QgsVector3D &intersection SIP_OUT ) SIP_HOLDGIL;
409
416 static double triangleArea( double aX, double aY, double bX, double bY, double cX, double cY ) SIP_HOLDGIL;
417
426 static double pointFractionAlongLine( double x1, double y1, double x2, double y2, double px, double py );
427
445 static void weightedPointInTriangle( double aX, double aY, double bX, double bY, double cX, double cY,
446 double weightB, double weightC, double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
447
454 static bool pointsAreCollinear( double x1, double y1, double x2, double y2, double x3, double y3, double epsilon );
455
462 static bool points3DAreCollinear( double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double epsilon );
463
484
485 static bool angleBisector( double aX, double aY, double bX, double bY, double cX, double cY, double dX, double dY,
486 double &pointX SIP_OUT, double &pointY SIP_OUT, double &angle SIP_OUT ) SIP_HOLDGIL;
487
504 static bool bisector( double aX, double aY, double bX, double bY, double cX, double cY,
505 double &pointX SIP_OUT, double &pointY SIP_OUT ) SIP_HOLDGIL;
506
507
522 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;
523
546 static bool intersectionPointOfLinesByBearing( double x1, double y1, double bearing1,
547 double x2, double y2, double bearing2,
548 double &intersectionX SIP_OUT, double &intersectionY SIP_OUT ) SIP_HOLDGIL;
549
568 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;
569
588 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;
589
598 static double azimuth( double x1, double y1, double x2, double y2 ) SIP_HOLDGIL;
599
600#ifndef SIP_RUN
601
621 template<typename T, typename... Args>
622 static bool fuzzyEqual( T epsilon, const Args &... args ) noexcept
623 {
624 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) != 0 ), "The number of arguments must be greater than 0 and even" );
625 constexpr size_t numArgs = sizeof...( args );
626 bool result = true;
627 T values[] = {static_cast<T>( args )...};
628
629 for ( size_t i = 0; i < numArgs / 2; ++i )
630 {
631 result = result && qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
632 }
633
634 return result;
635 }
636
657 template<typename T, typename... Args>
658 static bool fuzzyDistanceEqual( T epsilon, const Args &... args ) noexcept
659 {
660 static_assert( ( sizeof...( args ) % 2 == 0 || sizeof...( args ) >= 4 ), "The number of arguments must be greater than 4 and even" );
661 constexpr size_t numArgs = sizeof...( args );
662 const T squaredEpsilon = epsilon * epsilon;
663 T sum = 0;
664
665 T values[] = {static_cast<T>( args )...};
666
667 for ( size_t i = 0; i < numArgs / 2; ++i )
668 {
669 const T diff = values[i] - values[i + numArgs / 2];
670 sum += diff * diff;
671 }
672
673 return sum < squaredEpsilon;
674 }
675
692 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;
693
729 static bool createChamfer( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
730 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
731 const double distance1, const double distance2,
732 double &chamferStartX, double &chamferStartY,
733 double &chamferEndX, double &chamferEndY,
734 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
735 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
736 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
737 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
738 const double epsilon = 1e-8 );
739
775 static bool createFillet( const double segment1StartX, const double segment1StartY, const double segment1EndX, const double segment1EndY,
776 const double segment2StartX, const double segment2StartY, const double segment2EndX, const double segment2EndY,
777 const double radius,
778 double *filletPointsX, double *filletPointsY,
779 double *trim1StartX = nullptr, double *trim1StartY = nullptr,
780 double *trim1EndX = nullptr, double *trim1EndY = nullptr,
781 double *trim2StartX = nullptr, double *trim2StartY = nullptr,
782 double *trim2EndX = nullptr, double *trim2EndY = nullptr,
783 const double epsilon = 1e-8 );
784#endif
785};
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:6957
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_OUT
Definition qgis_sip.h:57
#define SIP_HOLDGIL
Definition qgis_sip.h:178