me trataron @ Bill responder y que en realidad no funciona cada vez y que tiene sentido. Basado en el link in his code. Tengamos por ejemplo estos dos segmentos de línea AB y CD.
A = (2,1,5), B = (1,2,5) y C = (2,1,3) y D = (2,1,2)
cuando intenta obtener la intersección que podría decirle Es el punto A (incorrecto) o no hay intersección (correcto). Dependiendo del orden ponemos aquellos segmentos en.
x = A + (B-A) s
x = C + (D-C) t
Bill resuelve para s pero nunca resuelto t. Y dado que desea que ese punto de intersección esté en ambos segmentos de línea, ambos s y t deben ser del intervalo < 0,1>. Lo que realmente ocurre en mi ejemplo es que solo s si de ese intervalo y t es -2. A se encuentra en línea definida por C y D, pero no en segmento de línea CD.
var s = Vector3.Dot(Vector3.Cross(dc, db), Vector3.Cross(da, db))/Norm2(Vector3.Cross(da, db));
var t = Vector3.Dot(Vector3.Cross(dc, da), Vector3.Cross(da, db))/Norm2(Vector3.Cross(da, db));
donde da es B-A, db es D-C y DC es nombres C-A, sólo preservadas proporcionadas por Bill.
Entonces como dije usted tiene que comprobar si ambos s y t son de < 0,1> y se puede calcular el resultado. Basado en la fórmula anterior.
if ((s >= 0 && s <= 1) && (k >= 0 && k <= 1))
{
Vector3 res = new Vector3(this.A.x + da.x * s, this.A.y + da.y * s, this.A.z + da.z * s);
}
Otro problema con las cuentas es cuando dos líneas son colineales y hay más de un punto de intersección. Habría división por cero. Quieres evitar eso.
Me gustan los cálculos en su respuesta, pero no creo que su afirmación sobre un algoritmo genérico sea cierta. Proyectar las líneas en el plano xy convertirá el problema en un problema 2d. Luego, encuentre la intersección de los puntos/líneas resultantes y pruebe su validez. Elegir z es solo una conveniencia de implementación. Trabajar en una dimensión inferior también podría reducir el recuento de la operación. –
@Derek, no estoy seguro de si proyectar líneas en el plano xy es una buena idea. Considere esto suponiendo que hay dos líneas x-y, cada una ubicada en diferentes planos 'z'. Si los proyecta a los planos xy, parecerán estar cruzando, aunque no lo estén. – Graviton
Pronto Hui, sí, eso es correcto. Después de determinar la intersección en el plano xy, necesitaría probar su validez. Esto es solo cuestión de "volver a enchufar los números". La ventaja es que si los números no se verifican, entonces se puede concluir que las líneas no se cruzan. Nota: necesitaría manejar un par de casos especiales (una línea se dirige a lo largo de z-hat, líneas paralelas).En una nota relacionada, la solución que publica a continuación supone que las líneas son infinitas. También necesitaría hacer una prueba de validación en esa solución. –