isLinesIntersection (2D & 3D)
Functions that test whether two line primitives (segments, rays, or infinite lines) intersect in 2D or 3D space.
Function Signatures
2D Intersection
template<typename LineT>
// Check intersection and optionally retrieve the intersection point.
bool isLinesIntersection2D(
    const LineT& geoAB,
    const LineT& geoCD,
    Eigen::RowVector2d& intersection
);
// Overload without retrieving the intersection point. 
template<typename LineT>
bool isLinesIntersection2D(
    const LineT& geoAB,
    const LineT& geoCD
);
Parameters
- 
geoAB: The first 2D line primitive (e.g.,
Segment2D,Ray2D,Line2D). Must provide membersP1andP2of typeEigen::RowVector2d. - 
geoCD: The second 2D line primitive, with the same requirements as
geoAB. - 
intersection: (Optional) If the line primitives intersect, receives the intersection point.
 
Return Value
trueif the two line primitives intersect; otherwise,false.
3D Intersection
// Check intersection within a distance threshold and retrieve the closest points.
template<typename T1, typename T2>
bool isLinesIntersection3D(
    const T1& geoAB,
    const T2& geoCD,
    std::tuple<Eigen::RowVector3d, Eigen::RowVector3d, double>& output,
    double threshold
);
// Overload without retrieving the intersection point.
template<typename T1, typename T2>
bool isLinesIntersection3D(
    const T1& geoAB,
    const T2& geoCD,
    double threshold
);
Parameters (3D Version)
| Parameter | Type | Description | 
|---|---|---|
geoAB | 
Any 3D line primitive (e.g., Segment3D, Ray3D, Line3D) with P1, P2 of type Eigen::RowVector3d. | 
First line/ray/segment. | 
geoCD | 
Same as geoAB. | 
Second line/ray/segment. | 
output | 
std::tuple<Eigen::RowVector3d, Eigen::RowVector3d, double> (optional) | 
If the line primitives intersect, this parameter will hold the closest points and the distance. | 
threshold | 
double | 
The maximum distance for which the line primitives are considered to intersect (only for 3D versions). | 
Return Value
trueif the minimum distance between the two line primitives is ≤threshold; otherwisefalse.
Example Usage
#include "LiteGeometry.h"
int main() {
    // Define the endpoints of two 3D segments
    Eigen::RowVector3d A(1, 1, 0);
    Eigen::RowVector3d B(0, -1, 0.4);
    Eigen::RowVector3d C(1, -1, 0);
    Eigen::RowVector3d D(0, 0, 0.5);
    Segment3D AB{ A ,B };
    Segment3D CD{ C ,D };
    // Tuple to hold the closest points and their distance
    std::tuple<Eigen::RowVector3d, Eigen::RowVector3d, double> intersectionInfo;
    // Test 1: threshold = 0.01
    bool intersects1 = isLinesIntersection3D(AB, CD, intersectionInfo, 0.01);
    // Test 2: threshold = 0.1
    bool intersects2 = isLinesIntersection3D(AB, CD, intersectionInfo, 0.1);
    return 0;
}
The minimum distance between segments AB and CD is 0.0604.
Left: with threshold = 0.01, the segments are considered non-intersecting.
Right: with threshold = 0.1, they are considered intersecting.