12 votos

Geometría: ¿Cómo determinar si dos líneas son paralelas en 3D basado en coordenadas de 2 puntos en cada línea?

Soy un ingeniero Belga de trabajo sobre el software en C# para proporcionar inteligente de flexión de soluciones para un fabricante de frenos de la prensa.

En este contexto, yo estoy buscando la mejor manera de determinar si dos rectas son paralelas, basado en la siguiente información:

  • Cada línea tiene dos puntos de los que las coordenadas son conocidas
  • Estas coordenadas son relativas a la misma trama
  • Para ser claro, tenemos cuatro puntos: A (ax, ay, az), B (bx,by,bz), C (cx,cy,cz) y D (dx,dy,dz)

Cual es la mejor manera de ser capaz de devolver un booleano simple que dice que si estas dos líneas son paralelas o no? Por favor alguien puede ayudarme?

Editar después de leer las respuestas A continuación es de mi C#-código, donde puedo usar dos objetos, CS3DLine y CSVector, pero el significado de los objetos que habla por sí mismo. Un toleratedPercentageDifference se usa así.

public static bool AreParallelLinesIn3D(CS3DLine left, CS3DLine right)
    {
        double toleratedPercentageDifference = 1;
        CSVector vLeft = new CSVector(left.p1, left.p2);
        CSVector vRight = new CSVector(right.p1, right.p2);
        double ricoX = vLeft.X / vRight.X ;
        double ricoY = vLeft.Y / vRight.Y ;
        double ricoZ = vLeft.Z / vRight.Z ;
        if (Math.Abs(ricoX - ricoY) > Math.Abs(toleratedPercentageDifference * ricoX / 100)) return false;
        if (Math.Abs(ricoX - ricoZ) > Math.Abs(toleratedPercentageDifference * ricoX / 100)) return false;
        return true;
    }

20voto

Yves Daoust Puntos 30126

Calcular $$AB\times CD$$ que es cero para las líneas paralelas.

En la práctica, existen errores de truncamiento y usted no va a obtener exactamente cero, por lo que es mejor para calcular el (Euclidiana) de la norma y compararlo con el producto de las normas. Por lo tanto

$$(AB\times CD)^2<\epsilon^2\,AB^2\,CD^2.$$


Tenga en cuenta que este es el mismo como la normalización de los vectores de la unidad de longitud y el cálculo de la norma de la cruz-producto, que es el seno del ángulo entre ellos.

Así, en la fórmula anterior, se tiene $\epsilon\approx\sin\epsilon$ $\epsilon$ puede ser interpretado como una tolerancia de ángulo, en radianes.

6voto

CodeMonkey1313 Puntos 4754

Las dos líneas son paralelas justo cuando los tres siguientes cocientes son iguales: $$ \frac{ax-bx}{cx-dx}, \ \frac{ay-por}{cy-dy}, \ \frac{az-bz}{cz-dz} \ . $$ Es fácil escribir una función que devuelve el valor booleano que usted necesita. Pero los cálculos de punto flotante puede ser problemático. Si alguno de los denominadores es $0$ usted tendrá que utilizar los recíprocos. Si los puntos están muy juntos o algunos de los denominadores son cerca de $0$ encontrará inestabilidades numéricas en las fracciones y en la prueba para la igualdad. Cuidado de la toma. Programa a la defensiva.

5voto

Brit Clousing Puntos 141

Todo lo que necesitas hacer es calcular la DotProduct. (Google "Producto escalar" para más información).

En detalle:

Si la línea #1 contiene los puntos a y B, y la línea #2 contiene los puntos C y D, entonces:

Calcular el vector #1: Vector1 = a - B.

Calcular el vector #2: Vector2 = C - D.

Entonces, la normalización de los dos vectores.

A continuación, calcular el producto escalar de dos vectores. (El producto escalar es un bonito estándar de operación para los vectores de modo que es probable que ya en el C# biblioteca). Esto le dará un valor que oscila entre -1.0 a 1.0.

Si Vector1 y Vector2 son paralelas, entonces el producto escalar será 1.0. Si el vector C->D pasa a estar yendo en la dirección opuesta como a->B, entonces el producto escalar será -1.0, pero las dos líneas todavía será paralelo.

Podría haber algunos errores de redondeo, de modo que usted pueda comprobar si el producto escalar es mayor de 0.99 o menos de -0.99. En cualquier caso, las rectas son paralelas o casi paralelas.

Si buscas en google "producto escalar" hay algunas ilustraciones que describen los valores del producto escalar dado diferentes vectores. He aquí uno: http://www.kimonmatara.com/wp-content/uploads/2015/12/dot_prod.jpg

2voto

Sugerencia: Escriba su ecuación en la forma $$\vec{x}=[ax,ay,az]+s[bx-ax,by-ay,bz-az]$$ where $$ %s es un número real. ¿Puede usted proceder? ¿O necesita más ayuda? el otro un $$\vec{x}=[cx,cy,cz]+t[dx-cx,dy-cy,dz-cz]$$ where $$ %t es un número real. Ahora tienes que descubrir si existe un número real $\Lambda tal que

$$[bx-ax,by-ay,bz-az]=\lambda[dx-cx,dy-cy,dz-cz]$$

1voto

gimusi Puntos 1255

Recordemos que dado puntos de $2$ $P$y $Q$ la ecuación paramétrica de la línea pasando a través de ellos es

$$P+t(Q-P)=P+tv$$

$v=Q-P$ el vector de dirección.

Entonces, que considere los vectores de dirección

  • $v_{AB}=(ax-bx,ay-by,az-bz)$
  • $v_{CD}=(cx-dx,cy-dy,cz-dz)$

Si son múltiples, que es linealmente dependiente, las dos líneas son paralelas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X