Pregunta

necesito una función que devuelve puntos en un círculo en tres dimensiones.

El círculo debe "cap" un segmento de línea definido por los puntos A y B y de radio. cada tapa es perpendicular al segmento de línea. y centrado en uno de los puntos finales.

Este es un diagrama de mierda

¿Fue útil?

Solución

Sea n el vector unitario en la dirección de A a B, es decir, N = (B-A) / longitud (A-B). El primer paso es encontrar dos vectores más de X e Y tal que {N, X, Y} forman una base. Esto significa que quiere dos vectores más de modo que todos los pares de {N, X, Y} son perpendiculares entre sí y también para que todos ellos son vectores unitarios. Otra forma de pensar acerca de esto es que desea crear un nuevo sistema de coordenadas cuyo eje X se alinea con el segmento de línea. Es necesario encontrar vectores que apuntan en la dirección del eje Y y el eje z.

Tenga en cuenta que hay un número infinito de opciones para X e Y. Sólo tiene que encontrar alguna manera de que dos de trabajo.

Una forma de hacer esto es primeros vectores descubrimiento {N, W, V} donde N es desde arriba y W y V son dos de (1,0,0), (0,1,0), y ( 0,0,1). Recoger los dos vectores de W y V que se corresponden con las cotas más pequeñas de N. Así que si N = (0.31, 0.95, 0), entonces tienes que elegir (1,0,0) y (0,0,1) para W y V. (Matemáticas friki nota: Esta manera de recoger W y V asegura que {N, W, V} vanos R ^ 3). A continuación, se aplica la proceso de Gram-Schmidt a {N, W, V } para obtener vectores {N, X, Y} como anteriormente. Tenga en cuenta que lo que necesita el vector N que es el primer vector de modo que no se ve modificado por el proceso.

Así que ahora tiene dos vectores que son perpendiculares al segmento de línea y perpendiculares entre sí. Esto significa que los puntos en el círculo alrededor de A son X * cos t + Y * sin donde 0 <= t <2 * pi t + A. Esto es exactamente igual que la descripción habitual de un círculo en dos dimensiones; que sólo está escrito en el nuevo sistema de coordenadas se ha descrito anteriormente.

Otros consejos

Como David Norman señaló el punto crucial es encontrar dos vectores unitarios ortogonales X, Y que son ortogonales a N. Sin embargo creo que una manera más sencilla para calcular estos es mediante la búsqueda de la familia Q reflexión que mapea N a un múltiplo de (1 , 0,0) y luego tomar como X la imagen de (0,1,0) bajo Q e y como la imagen de (0,0,1) bajo Q. Mientras que este sonido fuerzas complicado que se reduce a:

s = (N [0]> 0,0)? 1,0: -1,0

t = N [0] + s; f = -1,0 / (s * t);

X [0] = f * N [1] * t; X [1] = 1 + f * N [1] * N [1]; X [2] = f * N [1] * N [2];

Y [0] = f * N [2] * t; Y [1] = f * N [1] * N [2]; Y [2] = 1 + f * N [2] * N [2];

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top