6 votos

Encuentra extra arbitrarias dos puntos de un plano, dada la normal y un punto que se encuentra en el plano

Para un avión, tengo el normal $n$, y también un punto de $P$ que se encuentra en el avión.

Ahora, ¿cómo voy a encontrar más arbitraria de dos puntos ( $P_1$ $P_2$ ) para el plano de tal manera que estos tres puntos $P$, $P_1$ y $P_2$ definir completamente el avión?

La solución que aquí se sugiere que uno asume un determinado $x$ $y$ a sustituir en el plano de ecuación y encontrar el resto de $z$. Pero este método sólo es adecuado para la mano de cálculo; se rompe por avión $z=0$. Como tal, no es adecuado para el equipo de implementación.

Necesito un algoritmo que es robusto y puede manejar todos los casos, alguna idea de cómo construirlo?

Hay una pregunta similar aquí, y la respuesta me sugiere el uso de Gram-Schmidt, pero no veo cómo puede ser aplicado en mi caso aquí.

6voto

Matt Puntos 11

El problema fundamental aquí es encontrar dos vectores $u, v$ que son ortogonales a la vector de $n = (n_x, n_y, n_z)^T$. Morevover, el procedimiento debe ser numéricamente estable. Supongo que $|n| = 1$.

Enfoque 1. Encontrar el componente de $n$ que tiene el menor valor absoluto, decir $n_z = \epsilon_z$. El vector $n$ es, por tanto, "casi" en el x/y-plano (z = 0). Tomar el vector $w = (0, 0, 1)^T$, con todos los componentes iguales a cero, excepto que uno en el lugar de la componente más pequeño. Calcular $u = w \times n$. $u$ es ortogonal a $n$ y se calcula numéricamente estable porque es "casi" ortogonal a $n$. Finalizar el procedimiento mediante el cálculo de $v = n \times u$.

Enfoque 2. A menudo la Cabeza de orthogonalization se recomienda para mal condicionado orthogonalization. Se puede trabajar mejor que el 1.

  1. Construir ese "espejo" de vectores $w = (n_x + 1, n_y, n_z)$ o $w = (n_x - 1, n_y, n_z)$ cuya primera componente tiene mayor valor absoluto.
  2. Calcular el 3x3 de Familia de la matriz $H = I - 2 w w^T / (w^T w)$
  3. La primera fila de H será un vector unitario paralelo a $n$, y el otros dos filas se vectores unitarios ortogonales a $n$ y el uno al otro, es decir, estos son los vectores $u^T, v^T$.

Después de $u, v$ son calculadas, nos pusimos $P_1 = P + u, P_2 = P + v$.

1voto

yoliho Puntos 340

Aquí es un ingenuo "hack" que probablemente va a trabajar, y evitar los cálculos complejos. Mis disculpas a los puristas.

En primer lugar, que el avión no puede pasar a través de el origen es irrelevante, como otros han mencionó. Sólo imagina mover para que no pase por el origen (por ejemplo, restando $p$ de cada punto en el plano), y después de calcular el $p_1$ $p_2$ desea para el pasado avión, agregar $p$ a los dos puntos a cambio de que el avión de regreso.

En segundo lugar, usted sólo necesita encontrar $p_1$ firmeza, porque una vez que usted ha $p_1$ no muy cerca de la el origen (el ex -$p$), sólo puede rotar $p_1$$n$$90^\circ$.

Así que todo se reduce a encontrar un punto de $p_1$ sobre un plano por el origen que no es muy cerca del origen, dada la normal $n$. Deje $n=(a,b,c)$ como por lhf. Cualquier punto de $(x,y,z)$ sobre el plano satisface $a x + b y + c z = 0$.

Aquí está el truco. Elegir un punto al azar en el plano, digamos, la selección de dos coordenadas, la generación de números aleatorios, y la solución para que la tercera coordenada. Por supuesto, usted tienen que ser un poco inteligente acerca de los casos en que uno o dos coordenadas son cero, pero eso no es demasiado difícil. Si usted está demasiado cerca del origen de su la robustez de los requisitos, inténtelo de nuevo.

Finalmente, usted encontrará $p_1$. Girar alrededor de $n$ conseguir $p_2$. Finalmente recaer en la a $\{ p, p_1 + p, p_2 + p \}$.

1voto

osama Puntos 16

Caso 1: Si el avión no pase por el origen, entonces no hay ninguna base de este plano debido a que el avión no se forma un subespacio.

Caso 2: Si el plano pasa por el origen, entonces solo vector normal $n$ ya es suficiente para determinar este plano, y no es necesario dar el punto de $P$.

En el caso 2, deje $x$ ser un punto en el plano, a continuación, $$n^Tx=0$$ El uso de la Descomposición en valores Singulares (SVD), usted puede encontrar una base ortogonal del plano. El procedimiento es el siguiente. Supongamos que un SVD de a $n\in\mathbb{R}^d$ es $$n=U\Sigma V^T$$ donde$U\in\mathbb{R}^{d\times d}$$V\in\mathbb{R}$. Denotar $U=(u_1,u_2,\cdots,u_d)$, luego $$u_i^Tn=n^Tu_i=0$$ para todos los $i=2,\cdots,d$. Así que una base ortogonal del plano es $\{u_2,\cdots,u_d\}$.

1voto

lhf Puntos 83572

Que $n=(a,b,c)$. Si $a=b=0$, $(1,0,0)$ y $(0,1,0)$ como base. De lo contrario, tomar $u=(b,-a,0)$ y $v=n \times u$.

0voto

noDockless Puntos 21

Si cualquiera de los componentes de la normal, es distinto de cero (y sabemos que al menos UN componente no), cualquier valor de los otros dos componentes se ubican en ALGÚN punto en el plano. Digamos que tienes una normal con un resultado positivo o negativo de la componente y, usted sabe que cualquier par de x, los valores z se caen en algún lugar en su plano. Conecte cualquiera de los dos valores y resolver en el pasado utilizando el plano de ecuación.

vec3 get_point_on_plane(vec3 const& punto, vec3 const& norm) {

//get random x, y, z points
float x = point.x + 1;
float y = point.y + 1;
float z = point.z + 1;

/*
    Plane equation:
    Ax + By + Cz = D  ==  
    norm.x(x - point.x) + norm.y(y - point.y) + norm.z(z - point.z) = 0
*/
if (! nearly_equal(norm.x, 0)) //any y, z pair will fall SOMEWHERE on the plane
{
    //solve for x with rand_y and rand_z
    x = point.x - ( norm.y * (y - point.y) + norm.z * (z - point.z) ) / norm.x;

}
else if (! nearly_equal(norm.y, 0)) //any x, z pair will fall SOMEWHERE on the plane
{
    //solve for y with rand_x and rand_z
    y = point.y - ( norm.x * (x - point.x) + norm.z * (z - point.z) ) / norm.y;
}
else //any x, y pair will fall SOMEWHERE on the plane
{
    //solve for z with rand_x and rand_y
    z = point.z - ( norm.x * (x - point.x) + norm.y * (y - point.y) ) / norm.z;
}
return vec3(x, y, z);

}

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