Punto de intersección de rectas
Se dan dos rectas, descritas mediante las ecuaciones y . 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:
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:
}{ } = - \frac{c_1 b_2 - c_2 b_1}{a_1 b_2 - a_2 b_1},
}{} = - \frac{a_1 c_2 - a_2 c_1}{a_1 b_2 - a_2 b_1}.
Si el denominador es igual a , es decir
= 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 son proporcionales con la misma razón que los coeficientes y . Para ello solo hay que calcular los siguientes determinantes, y si ambos son iguales a , las rectas se superponen:
,
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;
}