Line-Segment Intersection

Let each line be defined by two points $$A_k$$ and $$B_k$$. The vector from $$A_k$$ to $$B_k$$ is $$\mathbf{v}_k$$. We can then express each line parametrically with

$L_1(t) = A_1 + \mathbf{v}_1t\\L_2(s)=A_2+\mathbf{v}_2s$

The intersection occurs when $$L_1(t) = L_2(s)$$, or

$A_1 + \mathbf{v}_1t = A_2+\mathbf{v}_2s$

Subtracting $$A_1$$ from both sides and perping with $$\mathbf{v}_2$$ yields

$(\mathbf{v}_1\perp\mathbf{v}_2) t = (A_2- A_1)\perp\mathbf{v}_2$

Dividing by $$\mathbf{v}_1\perp\mathbf{v}_2$$ yields

$t = \frac{(A_2- A_1)\perp\mathbf{v}_2}{\mathbf{v}_1\perp\mathbf{v}_2}$

and symmetrically

$s = \frac{(A_2- A_1)\perp\mathbf{v}_1}{\mathbf{v}_1\perp\mathbf{v}_2}$

JavaScript Implementation

function LineLine(A1, B1, A2, B2) {

const v0 = Vector2.fromPoints(A1, A2);
const v1 = Vector2.fromPoints(A1, B1);
const v2 = Vector2.fromPoints(A2, B2);

const w = v1.cross(v2);

if (w !== 0) {

const t = v0.cross(v2) / w;
const s = v0.cross(v1) / w;

if (t <= 1 && s <= 1 && 0 <= t && 0 <= s) {
}