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 ); }
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 ) ); }
58 static double sqrDistance2D(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL {
return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ); }
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;
87 static int leftOfLine(
const double x,
const double y,
const double x1,
const double y1,
const double x2,
const double y2 )
SIP_HOLDGIL;
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;
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;
170 static
void perpendicularOffsetPointAlongSegment(
double x1,
double y1,
double x2,
double y2,
double proportion,
double offset,
double *x
SIP_OUT,
double *y
SIP_OUT );
173 static
double ccwAngle(
double dy,
double dx )
SIP_HOLDGIL;
176 static
void circleCenterRadius(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double &radius
SIP_OUT,
185 static
bool circleClockwise(
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
188 static
bool circleAngleBetween(
double angle,
double angle1,
double angle2,
bool clockwise )
SIP_HOLDGIL;
194 static
bool angleOnCircle(
double angle,
double angle1,
double angle2,
double angle3 )
SIP_HOLDGIL;
197 static
double circleLength(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
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;
225 static
double sweepAngle(
double centerX,
double centerY,
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
230 static
double interpolateArcValue(
double angle,
double a1,
double a2,
double a3,
double zm1,
double zm2,
double zm3 )
SIP_HOLDGIL;
237 static
double normalizedAngle(
double angle )
SIP_HOLDGIL;
247 static
double lineAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
260 static
double angleBetweenThreePoints(
double x1,
double y1,
double x2,
double y2,
272 static
double linePerpendicularAngle(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
278 static
double averageAngle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 )
SIP_HOLDGIL;
286 static
double averageAngle(
double a1,
double a2 )
SIP_HOLDGIL;
310 static
int closestSideOfRectangle(
double right,
double bottom,
double left,
double top,
double x,
double y );
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
415 static
double triangleArea(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY )
SIP_HOLDGIL;
425 static
double pointFractionAlongLine(
double x1,
double y1,
double x2,
double y2,
double px,
double py );
444 static
void weightedPointInTriangle(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
453 static
bool pointsAreCollinear(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double epsilon );
461 static
bool points3DAreCollinear(
double x1,
double y1,
double z1,
double x2,
double y2,
double z2,
double x3,
double y3,
double z3,
double epsilon );
484 static
bool angleBisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
double dX,
double dY,
503 static
bool bisector(
double aX,
double aY,
double bX,
double bY,
double cX,
double cY,
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;
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;
571 static
double azimuth(
double x1,
double y1,
double x2,
double y2 )
SIP_HOLDGIL;
594 template<
typename T,
typename... Args>
595 static bool fuzzyEqual( T epsilon,
const Args &... args )
noexcept
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 );
600 T values[] = {
static_cast<T
>( args )...};
602 for (
size_t i = 0; i < numArgs / 2; ++i )
604 result = result &&
qgsNumberNear( values[i], values[i + numArgs / 2], epsilon );
630 template<
typename T,
typename... Args>
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;
638 T values[] = {
static_cast<T
>( args )...};
640 for (
size_t i = 0; i < numArgs / 2; ++i )
642 const T diff = values[i] - values[i + numArgs / 2];
646 return sum < squaredEpsilon;
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;
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 );
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,
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 );
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).