Skip to Content

Punto de intersección de rectas

Se dan dos rectas, descritas mediante las ecuaciones a1x+b1y+c1=0a_1 x + b_1 y + c_1 = 0 y a2x+b2y+c2=0a_2 x + b_2 y + c_2 = 0. Hay que encontrar el punto de intersección de las rectas, o determinar que las rectas son paralelas.

Solución

Si dos rectas no son paralelas, se intersectan. Para encontrar su punto de intersección, hay que resolver el siguiente sistema de ecuaciones lineales:

{a1x+b1y+c1=0a2x+b2y+c2=0{a1x+b1y+c1=0a2x+b2y+c2=0\begin{cases} a_1 x + b_1 y + c_1 = 0 \ a_2 x + b_2 y + c_2 = 0 \end{cases}

Usando la regla de Cramer, podemos escribir de inmediato la solución del sistema, que nos dará el punto de intersección requerido de las rectas:

x=c1b1c2b2a1b1a2b2=c1b2c2b1a1b2a2b1,x = - \frac{c1amp;b1c2amp;b2\begin{vmatrix}c_1 & b_1 \cr c_2 & b_2\end{vmatrix}}{a1amp;b1a2amp;b2\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix} } = - \frac{c_1 b_2 - c_2 b_1}{a_1 b_2 - a_2 b_1},

y=a1c1a2c2a1b1a2b2=a1c2a2c1a1b2a2b1.y = - \frac{a1amp;c1a2amp;c2\begin{vmatrix}a_1 & c_1 \cr a_2 & c_2\end{vmatrix}}{a1amp;b1a2amp;b2\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix}} = - \frac{a_1 c_2 - a_2 c_1}{a_1 b_2 - a_2 b_1}.

Si el denominador es igual a 00, es decir

a1b1a2b2=a1b2a2b1=0a1amp;b1a2amp;b2\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix} = a_1 b_2 - a_2 b_1 = 0

entonces o bien el sistema no tiene soluciones (las rectas son paralelas y distintas) o hay infinitas soluciones (las rectas se superponen). Si necesitamos distinguir estos dos casos, hay que comprobar si los coeficientes cc son proporcionales con la misma razón que los coeficientes aa y bb. Para ello solo hay que calcular los siguientes determinantes, y si ambos son iguales a 00, las rectas se superponen:

a1c1a2c2,b1c1b2c2a1amp;c1a2amp;c2\begin{vmatrix}a_1 & c_1 \cr a_2 & c_2\end{vmatrix}, b1amp;c1b2amp;c2\begin{vmatrix}b_1 & c_1 \cr b_2 & c_2\end{vmatrix}

Nótese que en el artículo Geometría básica se explica un enfoque distinto para calcular el punto de intersección.

Implementación

struct pt { double x, y; }; struct line { double a, b, c; }; const double EPS = 1e-9; double det(double a, double b, double c, double d) { return a*d - b*c; } bool intersect(line m, line n, pt & res) { double zn = det(m.a, m.b, n.a, n.b); if (abs(zn) < EPS) return false; res.x = -det(m.c, m.b, n.c, n.b) / zn; res.y = -det(m.a, m.c, n.a, n.c) / zn; return true; } bool parallel(line m, line n) { return abs(det(m.a, m.b, n.a, n.b)) < EPS; } bool equivalent(line m, line n) { return abs(det(m.a, m.b, n.a, n.b)) < EPS && abs(det(m.a, m.c, n.a, n.c)) < EPS && abs(det(m.b, m.c, n.b, n.c)) < EPS; }