@technobuddha/library
Version: 
A large library of useful functions
34 lines • 2.98 kB
JavaScript
/**
 * Determines whether a given point lies on a specified line segment.
 *
 * The function first checks if the point is within the bounding box of the segment,
 * allowing for a small epsilon tolerance to account for floating-point inaccuracies.
 * It then checks if the point is collinear with the segment using the cross product.
 *
 * @param point - The point to test, represented as a Cartesian coordinate.
 * @param segment - The line segment, defined by its two endpoints as Cartesian coordinates.
 * @returns `true` if the point lies on the line segment (within a small epsilon tolerance), otherwise `false`.
 *
 * @group Geometry
 * @category LineSegment
 * @category Point
 */
export function isPointOnLineSegment(point, segment) {
    const epsilon = 1e-10;
    // Check if point is within bounding box of line segment
    const minX = Math.min(segment.x0, segment.x1);
    const maxX = Math.max(segment.x0, segment.x1);
    const minY = Math.min(segment.y0, segment.y1);
    const maxY = Math.max(segment.y0, segment.y1);
    if (point.x < minX - epsilon ||
        point.x > maxX + epsilon ||
        point.y < minY - epsilon ||
        point.y > maxY + epsilon) {
        return false;
    }
    // Check if point is collinear with the line segment
    const crossProduct = (point.y - segment.y0) * (segment.x1 - segment.x0) -
        (point.x - segment.x0) * (segment.y1 - segment.y0);
    return Math.abs(crossProduct) < epsilon;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtcG9pbnQtb24tbGluZS1zZWdtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lzLXBvaW50LW9uLWxpbmUtc2VnbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFnQixFQUFFLE9BQW9CO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztJQUV0Qix3REFBd0Q7SUFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU5QyxJQUNFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU87UUFDeEIsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsT0FBTztRQUN4QixLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPO1FBQ3hCLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU8sRUFDeEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxNQUFNLFlBQVksR0FDaEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUMxQyxDQUFDIn0=