UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

41 lines (33 loc) 1.48 kB
/** * Calculate the intersect point of the two line segments (p1-p2 and p3-p4), end points included. * Note: If the line segments do NOT intersect then undefined is returned. * @see http://paulbourke.net/geometry/pointlineplane/ * @param {vec2} p1 - first point of first line segment * @param {vec2} p2 - second point of first line segment * @param {vec2} p3 - first point of second line segment * @param {vec2} p4 - second point of second line segment * @returns {vec2} intersection point of the two line segments, or undefined * @alias module:modeling/maths/utils.intersect */ const intersect = (p1, p2, p3, p4) => { // Check if none of the lines are of length 0 if ((p1[0] === p2[0] && p1[1] === p2[1]) || (p3[0] === p4[0] && p3[1] === p4[1])) { return undefined } const denominator = ((p4[1] - p3[1]) * (p2[0] - p1[0]) - (p4[0] - p3[0]) * (p2[1] - p1[1])) // Lines are parallel if (Math.abs(denominator) < Number.MIN_VALUE) { return undefined } const ua = ((p4[0] - p3[0]) * (p1[1] - p3[1]) - (p4[1] - p3[1]) * (p1[0] - p3[0])) / denominator const ub = ((p2[0] - p1[0]) * (p1[1] - p3[1]) - (p2[1] - p1[1]) * (p1[0] - p3[0])) / denominator // is the intersection along the segments if (ua < 0 || ua > 1 || ub < 0 || ub > 1) { return undefined } // Return the x and y coordinates of the intersection const x = p1[0] + ua * (p2[0] - p1[0]) const y = p1[1] + ua * (p2[1] - p1[1]) return [x, y] } module.exports = intersect