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 ); }
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 ) ); }
59 static double sqrDistance2D(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL {
return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
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;
88 static int leftOfLine(
const double x,
const double y,
const double x1,
const double y1,
const double x2,
const double y2 )
SIP_HOLDGIL;
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;
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;
171 static
void perpendicularOffsetPointAlongSegment(
double x1,
double y1,
double x2,
double y2,
double proportion,
double offset,
double *x
SIP_OUT,
double *y
SIP_OUT );
174 static
double ccwAngle(
double dy,
double dx )
SIP_HOLDGIL;
177 static
void circleCenterRadius(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double &radius
SIP_OUT,
186 static
bool circleClockwise(
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
189 static
bool circleAngleBetween(
double angle,
double angle1,
double angle2,
bool clockwise )
SIP_HOLDGIL;
195 static
bool angleOnCircle(
double angle,
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
198 static
double circleLength(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
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;
226 static
double sweepAngle(
double centerX,
double centerY,
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
231 static
double interpolateArcValue(
double angle,
double a1,
double a2,
double a3,
double zm1,
double zm2,
double zm3 )
SIP_HOLDGIL;
238 static
double normalizedAngle(
double angle )
SIP_HOLDGIL;
248 static
double lineAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
261 static
double angleBetweenThreePoints(
double x1,
double y1,
double x2,
double y2,
273 static
double linePerpendicularAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
279 static
double averageAngle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
287 static
double averageAngle(
double a1,
double a2 )
SIP_HOLDGIL;
311 static
int closestSideOfRectangle(
double right,
double bottom,
double left,
double top,
double x,
double y );
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
416 static
double triangleArea(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY )
SIP_HOLDGIL;
426 static
double pointFractionAlongLine(
double x1,
double y1,
double x2,
double y2,
double px,
double py );
445 static
void weightedPointInTriangle(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
454 static
bool pointsAreCollinear(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double epsilon );
462 static
bool points3DAreCollinear(
double x1,
double y1,
double z1,
double x2,
double y2,
double z2,
double x3,
double y3,
double z3,
double epsilon );
485 static
bool angleBisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
double dX,
double dY,
504 static
bool bisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
546 static
bool intersectionPointOfLinesByBearing(
double x1,
double y1,
double bearing1,
547 double x2,
double y2,
double bearing2,
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;
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;
598 static
double azimuth(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
621 template<
typename T,
typename... Args>
622 static bool fuzzyEqual( T epsilon,
const Args &... args )
noexcept
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 );
627 T values[] = {
static_cast<T
>( args )...};
629 for (
size_t i = 0; i < numArgs / 2; ++i )
631 result = result &&
qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
657 template<
typename T,
typename... Args>
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;
665 T values[] = {
static_cast<T
>( args )...};
667 for (
size_t i = 0; i < numArgs / 2; ++i )
669 const T diff = values[i] - values[i + numArgs / 2];
673 return sum < squaredEpsilon;
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;
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 );
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,
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 );
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...
Represent a 2-dimensional vector.
bool qgsNumberNear(T a, T b, T epsilon=std::numeric_limits< T >::epsilon() *4)
Compare two numbers of type T (but allow some difference).