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 ); }
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 ) ); }
54 static double sqrDistance2D(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL {
return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
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;
73 static int leftOfLine(
const double x,
const double y,
const double x1,
const double y1,
const double x2,
const double y2 )
SIP_HOLDGIL;
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;
115 static
void perpendicularOffsetPointAlongSegment(
double x1,
double y1,
double x2,
double y2,
double proportion,
double offset,
double *x
SIP_OUT,
double *y
SIP_OUT );
118 static
double ccwAngle(
double dy,
double dx )
SIP_HOLDGIL;
121 static
void circleCenterRadius(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double &radius
SIP_OUT,
130 static
bool circleClockwise(
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
133 static
bool circleAngleBetween(
double angle,
double angle1,
double angle2,
bool clockwise )
SIP_HOLDGIL;
139 static
bool angleOnCircle(
double angle,
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
142 static
double circleLength(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
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;
170 static
double sweepAngle(
double centerX,
double centerY,
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
175 static
double interpolateArcValue(
double angle,
double a1,
double a2,
double a3,
double zm1,
double zm2,
double zm3 )
SIP_HOLDGIL;
182 static
double normalizedAngle(
double angle )
SIP_HOLDGIL;
192 static
double lineAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
205 static
double angleBetweenThreePoints(
double x1,
double y1,
double x2,
double y2,
217 static
double linePerpendicularAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
223 static
double averageAngle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
231 static
double averageAngle(
double a1,
double a2 )
SIP_HOLDGIL;
255 static
int closestSideOfRectangle(
double right,
double bottom,
double left,
double top,
double x,
double y );
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
360 static
double triangleArea(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY )
SIP_HOLDGIL;
370 static
double pointFractionAlongLine(
double x1,
double y1,
double x2,
double y2,
double px,
double py );
389 static
void weightedPointInTriangle(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
398 static
bool pointsAreCollinear(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double epsilon );
421 static
bool angleBisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
double dX,
double dY,
440 static
bool bisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
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;
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;
508 static
double azimuth(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
531 template<
typename T,
typename... Args>
532 static bool fuzzyEqual( T epsilon,
const Args &... args )
noexcept
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 );
537 T values[] = {
static_cast<T
>( args )...};
539 for (
size_t i = 0; i < numArgs / 2; ++i )
541 result = result &&
qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
567 template<
typename T,
typename... Args>
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;
575 T values[] = {
static_cast<T
>( args )...};
577 for (
size_t i = 0; i < numArgs / 2; ++i )
579 const T diff = values[i] - values[i + numArgs / 2];
583 return sum < squaredEpsilon;
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,
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 );
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,
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 );
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...
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).