geometry

# # Explanation

Let 2 segments \$S1(p_0, p_1), $S2(p_2, p_3)$ and their cross point $p$.
S1 can be seen as base of 2 triangles.
2 triangles with vertices $p_2$ and $p_3$ and the common base S1.
Let the heights $h_1$ and $h_2$.

A height of a triangle can be calculated with its area and length of its base.
Length of base is $|\vec{p_0 p_1}|$.
The area can be calculated by using cross product $\vec{p_0 p_1} \cross \vec{p_0 p_2}$.

2 heights satisfies the proportion below.

$|\vec{p_2 p}| : |\vec{p_2 p_3}| = h_1 : h_1 + h_2$

Transform it from the point of view of length.

$l = |\vec{p_2 p}| = \frac{|\vec{p_2 p_3}| \times h_1}{h_1 + h_2}$

$\vec{p_2 p} = \vec{p_2 p_3} \times l$

$p = p_2 + \vec{p_2 p}$

Don't forget that the resultign coordinates can include errors.

# # Code

Vector2 crossPoint(Vector2 &p0, Vector2 &p1, Vector2 &p2, Vector2 &p3) {
Vector2 baseSeg = p1 - p0;
Vector2 crossSeg = p3 - p2;
double h1 = fabs(baseSeg.cross(p2 - p0)) / (baseSeg.length() * 2);
double h2 = fabs(baseSeg.cross(p3 - p0)) / (baseSeg.length() * 2);
Vector2 p = p2 + crossSeg * h1 / (h1 + h2);
if (fabs(p.x) < EPS) p.x = 0.0;
if (fabs(p.y) < EPS) p.y = 0.0;
return p;
}


Remote freelancer. A web and mobile application enginner.
Traveling around the world based on East Asia.
I'm looking forward to your job offers from all over the world!

Offer jobs or contact me!