UNPKG

@technobuddha/library

Version:
35 lines 3.29 kB
/** * Calculates the intersection point of two line segments. * @param a - The first line segment. * @param b - The second line segment. * @param extend - If `true`, treats the segments as infinite lines; if `false`, only considers the actual segments. * @returns The intersection point as a `Point` object if the segments (or lines, if `extend` is `true`) intersect. * Returns `undefined` if the lines are parallel or coincident. * Returns `null` if the intersection is outside the segments and `extend` is `false`. * @example * ```typescript * lineIntersection( * { x0: 0, y0: 0, x1: 4, y1: 4 }, * { x0: 0, y0: 4, x1: 4, y1: 0 } * ); // { x: 2, y: 2 } * ``` * @group Geometry * @category Line Segment */ export function lineIntersection(a, b, extend = false) { const denominator = (b.y1 - b.y0) * (a.x1 - a.x0) - (b.x1 - b.x0) * (a.y1 - a.y0); if (denominator === 0) { // Lines are parallel or coincident return undefined; } const ua = ((b.x1 - b.x0) * (a.y0 - b.y0) - (b.y1 - b.y0) * (a.x0 - b.x0)) / denominator; const ub = ((a.x1 - a.x0) * (a.y0 - b.y0) - (a.y1 - a.y0) * (a.x0 - b.x0)) / denominator; if (!extend && (ua < 0 || ua > 1 || ub < 0 || ub > 1)) { return null; // Intersection is outside the line segments } return { x: a.x0 + ua * (a.x1 - a.x0), y: a.y0 + ua * (a.y1 - a.y0), }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1pbnRlcnNlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbGluZS1pbnRlcnNlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixDQUFjLEVBQ2QsQ0FBYyxFQUNkLE1BQU0sR0FBRyxLQUFLO0lBRWQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVsRixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixtQ0FBbUM7UUFDbkMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUN6RixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7SUFFekYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLENBQUMsNENBQTRDO0lBQzNELENBQUM7SUFFRCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM3QixDQUFDO0FBQ0osQ0FBQyJ9