line line intersection

JavaScript
const intersects = (lineSeg1, lineSeg2) => {
	const x1 = lineSeg2.x1;
    const y1 = lineSeg2.y1;
    const x2 = lineSeg2.x2;
    const y2 = lineSeg2.y2;

    const x3 = lineSeg1.x1;
    const y3 = lineSeg1.y1;
    const x4 = lineSeg1.x2;
    const y4 = lineSeg1.y2;

    const den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
    if (!den) return;

    const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den;
    const u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den;
    return t >= 0 && t <= 1 && u >= 0 && u <= 1 ? {x: x1 + t * (x2 - x1), y: y1 + t * (y2 - y1) } : false;
}

// Or if you'd rather
const intersects = (lineSeg1, lineSeg2) => {
    den = (lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2);
    if (!den) return;
    t = ((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / den;
    u = -((lineSeg2.x1 - lineSeg2.x2) * (lineSeg2.y1 - lineSeg1.y1) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg2.x1 - lineSeg1.x1)) / den;
    return t >= 0 && t <= 1 && u >= 0 && u <= 1 ? {x: lineSeg2.x1 + t * (lineSeg2.x2 - lineSeg2.x1), y: lineSeg2.y1 + t * (lineSeg2.y2 - lineSeg2.y1) } : false;
}

// Or if you really want
const intersects = (lineSeg1, lineSeg2) => {
	if (!((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) return;
    return (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) >= 0 && (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) <= 1 && (-((lineSeg2.x1 - lineSeg2.x2) * (lineSeg2.y1 - lineSeg1.y1) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg2.x1 - lineSeg1.x1)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) >= 0 && (-((lineSeg2.x1 - lineSeg2.x2) * (lineSeg2.y1 - lineSeg1.y1) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg2.x1 - lineSeg1.x1)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) <= 1 ? { x: lineSeg2.x1 + (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) * (lineSeg2.x2 - lineSeg2.x1), y: lineSeg2.y1 + (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) * (lineSeg2.y2 - lineSeg2.y1) } : false;
}

// And just in case you want a reallly really long line
const intersects = (lineSeg1, lineSeg2) => (!((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) ? false : (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) >= 0 && (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) <= 1 && (-((lineSeg2.x1 - lineSeg2.x2) * (lineSeg2.y1 - lineSeg1.y1) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg2.x1 - lineSeg1.x1)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) >= 0 && (-((lineSeg2.x1 - lineSeg2.x2) * (lineSeg2.y1 - lineSeg1.y1) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg2.x1 - lineSeg1.x1)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) <= 1 ? { x: lineSeg2.x1 + (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) * (lineSeg2.x2 - lineSeg2.x1), y: lineSeg2.y1 + (((lineSeg2.x1 - lineSeg1.x1) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg1.y1) * (lineSeg1.x1 - lineSeg1.x2)) / ((lineSeg2.x1 - lineSeg2.x2) * (lineSeg1.y1 - lineSeg1.y2) - (lineSeg2.y1 - lineSeg2.y2) * (lineSeg1.x1 - lineSeg1.x2))) * (lineSeg2.y2 - lineSeg2.y1) } : false;
Source

Also in JavaScript: