UNPKG

@technobuddha/library

Version:
34 lines 2.98 kB
/** * 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=