Saltar al contenido

Encontrar puntos de intersección entre 3 esferas

Este dilema se puede tratar de diferentes maneras, pero en este caso te mostramos la que para nosotros es la resolución más completa.

Solución:

Probablemente más fácil que construir círculos en 3D, porque se trabaja principalmente en líneas y planos:

Para cada par de esferas, obtenga la ecuación del plano que contiene su círculo de intersección, restando las ecuaciones de las esferas (cada una de la forma X^2+Y^2+Z^2+aX+bY+c*Z+d=0). Entonces tendrás tres planos P12 P23 P31.

Estos planos tienen una línea común L, perpendicular al plano Q por los tres centros de las esferas. Los dos puntos que estás buscando están en esta línea. El medio de los puntos es la intersección H entre L y Q.

Para implementar esto:

  • calcular las ecuaciones de P12 P23 P32 (diferencia de ecuaciones de esfera)
  • calcular la ecuación de Q (resolver un sistema lineal o calcular un producto vectorial)
  • calcule las coordenadas del punto H intersección de estos cuatro planos. (resuelve un sistema lineal)
  • obtener el vector normal U a Q de su ecuación (normalizar un vector)
  • calcular la distancia t entre H y una solución X: t^2=R1^2-HC1^2, (C1,R1) son el centro y el radio de la primera esfera.
  • las soluciones son H+tU y Httu

texto alternativo

Una construcción 3D de Cabri que muestra los distintos planos y la línea L

Aquí hay una respuesta en Python que acabo de transferir del artículo de Wikipedia. No hay necesidad de un algoritmo; hay una solución de forma cerrada.

import numpy                                             
from numpy import sqrt, dot, cross                       
from numpy.linalg import norm                            

# Find the intersection of three spheres                 
# P1,P2,P3 are the centers, r1,r2,r3 are the radii       
# Implementaton based on Wikipedia Trilateration article.                              
def trilaterate(P1,P2,P3,r1,r2,r3):                      
    temp1 = P2-P1                                        
    e_x = temp1/norm(temp1)                              
    temp2 = P3-P1                                        
    i = dot(e_x,temp2)                                   
    temp3 = temp2 - i*e_x                                
    e_y = temp3/norm(temp3)                              
    e_z = cross(e_x,e_y)                                 
    d = norm(P2-P1)                                      
    j = dot(e_y,temp2)                                   
    x = (r1*r1 - r2*r2 + d*d) / (2*d)                    
    y = (r1*r1 - r3*r3 -2*i*x + i*i + j*j) / (2*j)       
    temp4 = r1*r1 - x*x - y*y                            
    if temp4<0:                                          
        raise Exception("The three spheres do not intersect!");
    z = sqrt(temp4)                                      
    p_12_a = P1 + x*e_x + y*e_y + z*e_z                  
    p_12_b = P1 + x*e_x + y*e_y - z*e_z                  
    return p_12_a,p_12_b                       

ACTUALIZAR

Se puede encontrar una implementación de esta respuesta en python completa con un ejemplo de uso en este repositorio de github.

Resulta que la solución analítica es bastante buena usando este método y puede decirle cuándo existe una solución y cuándo no (también es posible tener exactamente una solución). No hay razón para usar el método de Newton.

En mi humilde opinión, esto es mucho más fácil de entender y más simple que la trilateración que se indica a continuación. Sin embargo, ambas técnicas dan respuestas correctas en mis pruebas.

RESPUESTA ORIGINAL

Considere la intersección de dos esferas. Para visualizarlo, considere el segmento de línea 3D N que conecta los dos centros de las esferas. Considere esta sección transversal

texto alternativo
(fuente: googlepages.com)

donde la línea roja es la sección transversal del plano con N normal. Por simetría, puede rotar esta sección transversal desde cualquier ángulo, y la longitud de los segmentos de la línea roja no puede cambiar. Esto significa que la curva resultante de la intersección de dos esferas es un círculo, y debe estar en un plano con N normal.

Dicho esto, empecemos a encontrar la intersección. Primero, queremos describir el círculo resultante de la intersección de dos esferas. Tú no puedo haz esto con 1 ecuación, un círculo en 3D es esencialmente una curva en 3D y no puedes describir curvas en 3D por 1 eq.

Considere la imagen
texto alternativo
(fuente: googlepages.com)

Sea P el punto de intersección de la línea azul y roja. Sea h la longitud del segmento de línea a lo largo de la línea roja desde el punto P hacia arriba. Sea d la distancia entre los dos centros. Sea x la distancia desde el centro del círculo pequeño a P. Entonces debemos tener

x^2 +h^2 = r1^2
(d-x)^2 +h^2 = r2^2
==> h = sqrt(r1^2 - 1/d^2*(r1^2-r2^2+d^2)^2)

es decir, puede resolver para h, que es el radio del círculo de intersección. Puedes encontrar el punto central C del círculo desde x, a lo largo de la línea N que une los 2 centros del círculo.

Entonces puedes describir completamente el círculo como (X,C,U,V son todos vectores)

X = C + (h * cos t) U + (h * sin t) V for t in [0,2*PI)

donde U y V son vectores perpendiculares que se encuentran en un plano con N normal.

La última parte es la más fácil. Solo queda encontrar la intersección de este círculo con la esfera final. Esto es simplemente conectar y tragar las ecuaciones (conectar para x, y, z en la última ecuación las formas paramétricas de x, y, z para el círculo en términos de t y resolver para t).

editar ---

La ecuación que obtendrás es bastante fea, tendrás un montón de senos y cosenos iguales a algo. Para solucionar esto puedes hacerlo de 2 formas:

  1. escribe el coseno y el seno en términos de exponenciales usando la igualdad

    e^(it) = cos t + i sin t

    luego agrupe todos los términos de e^(it) y debería obtener ecuaciones cuadráticas de e^(it) que pueda resolver usando la fórmula cuadrática, luego resuelva para t. Esto le dará la solución exacta. Este método te dirá exactamente si existe una solución, si existen dos o si existe una dependiendo de cuántos de los puntos del método cuadrático sean reales.

  2. use el método de newton para resolver t, este método no es exacto pero es computacionalmente mucho más fácil de entender, y funcionará muy bien para este caso.

Sección de Reseñas y Valoraciones

Eres capaz de apoyar nuestro cometido escribiendo un comentario o dejando una valoración te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *