Respuesta corta: Resolver exactamente si los dos objetos se cruzan es lo suficientemente complicado como para ser inviable con el propósito de detección de colisión. Discretice su elipse como un polígono de n lados para algunos n (según la precisión que necesite) y realice la detección de colisiones con ese polígono.
Respuesta larga: si insiste en determinar si la elipse lisa y el círculo se cruzan, existen dos enfoques principales. Ambos implican resolver primero el punto más cercano al centro del círculo en la elipse, y luego comparar esa distancia con el radio del círculo.
Método 1: Utilice una parametrización de la elipse. Transforme sus coordenadas para que la elipse se encuentre en el origen, con sus ejes alineados con los ejes x-y. Esto es:
- Centro de elipse: (0,0)
- Centro de círculo: c = (cx, cy)
- Radio del círculo: r
- Radio del eje x-alineado de elipse: a
- Radio del eje de elipse alineado con y: b.
La ecuación de la elipse viene dada por a cos(t), b sin(t)
. Para encontrar el punto más cercano, queremos minimizar la distancia cuadrada || (a cos t, b sin t) - c ||^2
. Como Jean señala, esto es "solo cálculo": tomar una derivada y establecerla igual a 0. A menos que me falta algo, sin embargo, resolver la ecuación resultante (bastante desagradable) para t
no es posible analíticamente, y debe ser aproximada usando, por ejemplo Método de Newton. Enchufa el t
que encuentras en la ecuación paramétrica para obtener el punto más cercano.
- Pro: La solución numérica está solo en una variable,
t
.
- Con: Debe ser capaz de escribir una parametrización de la elipse, o transformar sus coordenadas para que pueda.Esto no debería ser demasiado difícil para cualquier representación razonable que tenga de la elipse. Sin embargo, voy a mostrarte un segundo método, que es mucho más general y podría ser útil si tienes que generalizar tu problema a, por ejemplo, 3D.
Método 2: Usa cálculo multidimensional. No es necesario un cambio de coordenadas.
- Centro de círculo: c = (cx, cy)
- Radio de cirlce: r
- elipse es dada por g (x, y) = 0 para una función g. Por ejemplo, según la respuesta de Curd puedes usar g (x, y) = distancia de (x, y) desde el foco 1 + distancia de (x, y) desde el foco 2 - e.
Encontrar el punto de la elipse más cercano al centro del círculo a continuación, puede expresarse como una constreñido problema minimización:
Minimize ||(x,y) - c||^2 subject to g(x,y) = 0
(minimizando la distancia cuadrado es equivalente a minimizar la distancia, y mucho más agradable de tratar ya que es un polinomio cuadrático en x, y).
Para resolver el problema de minimización restringido, presentamos el multiplicador de Lagrange lambda, y resolver el sistema de ecuaciones
2 * [ (x,y) -c ] + lambda * Jg(x,y) = 0
g(x,y) = 0
Aquí Jg es el gradiente de g. Este es un sistema de tres ecuaciones (no lineales) en tres incógnitas: x, y y lambda. Podemos resolver este sistema usando el Método de Newton, y el (x, y) que obtenemos es el punto más cercano al centro del círculo.
- Pro: No se parametrización hay que encontrar
- Pro: El método es muy general, y funciona bien siempre que la escritura g es más fácil que encontrar una ecuación paramétrica (como en 3D)
- contra: Requiere una resolución multivariable de Newton, que es muy complicada si no tienes acceso a un paquete de métodos numéricos.
Advertencia: ambos enfoques resolver técnicamente para el punto, que extremizes la distancia hasta el centro del círculo. Por lo tanto, el punto encontrado podría ser el punto más alejado del círculo, y no el más cercano. Para ambos métodos, siembra tu resolución con una buena conjetura inicial (el centro del círculo funciona bien para el Método 2, estás solo para el Método 1) reducirá este peligro.
Posible tercer enfoque?: Puede ser posible resolver directamente las raíces del sistema de dos ecuaciones cuadráticas en dos variables que representan el círculo y la elipse. Si existe una raíz real, los objetos se cruzan. La forma más directa de resolver este sistema, de nuevo usando un algoritmo numérico como el Método de Newton, no ayudará porque la falta de convergencia no implica la inexistencia de una raíz real. Sin embargo, para dos ecuaciones cuadráticas en dos variables, puede existir un método especializado que garantice encontrar raíces reales, si existen. Yo mismo no puedo pensar en una manera de hacerlo, pero es posible que desee investigarlo usted mismo (o ver si alguien en stackoverflow puede elaborarlo.)
Usted indicó OpenGL, pero no un idioma. ¿Estás usando C? –
Pensé que estaba relacionado con opengl. En realidad, estoy usando actionscript. – adiian
Uno puede _precluir_ la intersección entre dos elipses si los círculos que usan sus radios principales no se cruzan. – greybeard