72 votos

Comprueba si un punto está dentro de una elipse

Tengo una elipse centrada en $(h,k)$ con el semieje mayor $r_x$ , eje semi-menor $r_y$ ambos alineados con el plano cartesiano.

¿Cómo determino si un punto $(x,y)$ está dentro del área delimitada por la elipse?

0 votos

¿Cuál de las dos soluciones es más eficiente (desde el punto de vista computacional) asumiendo que en ambos casos se implementan los rechazos "|xh|>rx" y "|yk|>ry"?

2 votos

@rsanchezsaez Probablemente la de Srivatsan porque las raíces cuadradas son lentas; si te preocupa el rendimiento, escribir ambas y ponerlas en el banco es probablemente la mejor ruta. Alternativamente, podrías intentar plantear la pregunta en Stack Overflow.

0 votos

Gracias por los consejos Dan. He implementado los de Srivatsan y parece que funcionan bien. No quiero gastar mucho tiempo en una optimización prematura. Si en el futuro nos encontramos con problemas de rendimiento vamos a perfilar para ver si este es el cuello de botella.

129voto

delroh Puntos 56

La región (disco) delimitada por la elipse viene dada por la ecuación $$ \frac{(x-h)^2}{r_x^2} + \frac{(y-k)^2}{r_y^2} \leq 1. \tag{1} $$ Así que dado un punto de prueba $(x,y)$ Enchúfalo $(1)$ . Si se cumple la desigualdad, entonces está dentro de la elipse; en caso contrario, está fuera de la elipse. Además, el punto está en el límite de la región (es decir, en la elipse) si y sólo si la desigualdad se satisface firmemente (es decir, el lado izquierdo se evalúa como $1$ ).

11 votos

Acabo de registrarme para subir el voto de esto. Estoy desarrollando una aplicación para Android y esto ha sido EXACTAMENTE lo que estaba buscando. Gracias

1 votos

¿Qué hace h y k representar, ¿es el origen de la elipse?

0 votos

Es de suponer que esto se extiende a las multidimensiones, simplemente convirtiendo el lado izquierdo de la desigualdad en un término de suma para cada dimensión.

9voto

marty cohen Puntos 33863

Otra forma utiliza la definición de la elipse como los puntos cuya suma de distancias a los focos es constante.

Obtenga los focos en $(h+f, k)$ y $(h-f, k)$ , donde $f = \sqrt{r_x^2 - r_y^2}$ .

La suma de las distancias (mirando las líneas de $(h, k+r_y)$ a los focos) es $2\sqrt{f^2 + r_y^2} = 2 r_x $ .

Así, para cualquier punto $(x, y)$ , calcula $\sqrt{(x-(h+f))^2 + (y-k)^2} + \sqrt{(x-(h-f))^2 + (y-k)^2} $ y comparar esto con $2 r_x$ .

Esto lleva más trabajo, pero me gusta usar la definición geométrica.

Además, para ambos métodos, si la velocidad es importante (es decir, usted está haciendo esto para muchos puntos), puede rechazar inmediatamente cualquier punto $(x, y)$ para lo cual $|x-h| > r_x$ o $|y-k| > r_y$ .

2 votos

Correcto, es más fácil comprobar si un punto está dentro de un rectángulo. Si no está en el rectángulo, ciertamente no puede estar en la elipse.

8voto

1) Considerar el punto como un vector

$$ p=\begin{bmatrix} x \\ y \\ \end{bmatrix} $$

2) Considera el centro de la elipse como

$$ c=\begin{bmatrix} h \\ k \\ \end{bmatrix} $$

3) Resta el centro de la elipse $$ p_{centered}= p - c $$ 4) Crear una matriz de blanqueo $$ W = \Lambda^{-1/2}E^T $$ donde $$ \Lambda = \begin{bmatrix} r_x & 0 \\ 0 & r_y \\ \end{bmatrix} $$ y $$ E = \begin{bmatrix} e_{major} & e_{minor}\\ \end{bmatrix} $$ donde $e_{major}$ y $e_{major}$ son los vectores unitarios en la dirección de los ejes mayor y menor de la elipse. Como tu ejemplo es para una matriz no rotada con el eje mayor en el eje x y el eje menor en el eje y

$e_{major}=\begin{bmatrix} 1\\ 0\\ \end{bmatrix}$ y $e_{minor}=\begin{bmatrix} 0\\ 1\\ \end{bmatrix}$

5) Blanquear la punta $$ p_{white} = Wp_{centered} $$ 6) Comprueba si la longitud del vector es menor que 1. Si lo es, entonces el punto está dentro de la elipse.

Nota: esto se inspira en mi experiencia con las matrices de covarianza. Intentaré actualizar esta respuesta con una relación intuitiva entre las elipses y las matrices de covarianza. Por ahora puedes echar un vistazo a http://www.visiondummy.com/2014/04/draw-error-ellipse-representing-covariance-matrix/

3voto

Victor Engel Puntos 191

Tengo otra solución. En resumen, transformar todo para poder comprobar si un punto está dentro de una circunferencia centrada en (0,0). Como la elipse está orientada ortogonalmente al plano cartesiano, podemos simplemente escalar una de las dimensiones por el cociente de los dos ejes.

Primero resta (h,k) de ambos puntos.

(h,k) se convierte en (0,0). (x,y) se convierte en (x-h,y-k).

Ahora escalamos la segunda coordenada, normalizándola a la primera.

Escalando (x-h,y-k) obtenemos $$ (x-h,(y-k) * \frac{r_x}{r_y}) $$

Ahora sólo tenemos que comprobar si $$ |(x-h,(y-k) * \frac{r_x}{r_y})| <= r_x $$

0 votos

Me disculpo. La codificación de las fracciones no se ha hecho. ¿Quizás alguien pueda ayudarme con eso y señalarme una referencia? Estaba usando meta.math.stackexchange.com/questions/5020/ como guía. Edición: Lo he descubierto. Me faltaba la etiqueta \$$.

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