Teniendo un círculo con el centro $(x_c, y_c)$ y el radio $r$, ¿cómo saber si un punto $(x_p, y_p)$ está dentro del círculo?
No diría que está dentro del círculo cuando la distancia es $ r $.
Teniendo un círculo con el centro $(x_c, y_c)$ y el radio $r$, ¿cómo saber si un punto $(x_p, y_p)$ está dentro del círculo?
La distancia entre $\langle x_c,y_c\rangle$ y $\langle x_p,y_p\rangle$ está dada por el teorema de Pitágoras como $$d=\sqrt{(x_p-x_c)^2+(y_p-y_c)^2}\;.$$ El punto $\langle x_p,y_p\rangle$ está dentro del círculo si $dr$. Puedes ahorrarte un poco de trabajo comparando $d^2$ con $r^2$ en su lugar: el punto está dentro del círculo si $d^2r^2$. Por lo tanto, quieres comparar el número $(x_p-x_c)^2+(y_p-y_c)^2$ con $r^2$.
Yo diría que estás confundiendo el disco (cerrado) con el círculo. Un punto a una distancia $r$ del centro está dentro del disco pero no dentro del círculo; más bien, está en el círculo. (Es un punto bastante menor, pero hay suficientes ocasiones de confusión terminológica que prefiero evitarlo cuando es fácil hacerlo).
Alex y Brian ya han respondido tu pregunta. En caso de que estés tratando de implementar este algoritmo en algún lenguaje de programación, aquí está mi implementación en Haskell:
distance :: Floating a => (a, a) -> (a, a) -> a
distance (x1,y1) (x2,y2) = sqrt((x1-x2)**2 + (y1-y2)**2)
isInsideCircle :: (Ord a, Floating a) => a -> (a, a) -> (a, a) -> Bool
isInsideCircle r (xc,yc) (x,y) | (distance (xc,yc) (x,y) < r) = True
| (distance (xc,yc) (x,y) >= r) = False
Supongamos que tienes un círculo cuyo radio es $r = 1$ y cuyo centro es el origen $(0,0)$. Te gustaría saber si $(\frac{1}{2},0)$, $(1,0)$ y $(1,1)$ están dentro del círculo. La siguiente sesión interactiva con GHCi responde la pregunta:
*Main> isInsideCircle 1 (0,0) (0.5,0)
True
*Main> isInsideCircle 1 (0,0) (1,0)
False
*Main> isInsideCircle 1 (0,0) (1,1)
False
Aquí también está la implementación en Kotlin: fun isInsideCircle(x: Float, y: Float, circleX: Float, circleY: Float, circleRadius: Float): Boolean { val absX = Math.pow(Math.abs(x - circleX).toDouble(), 2.0) val absY = Math.pow(Math.abs(y - circleY).toDouble(), 2.0) return Math.sqrt(absX + absY) < circleRadius }
@YuriySeredyuk Ese código en Kotlin es innecesariamente ineficiente. Usar Math.pow es una forma muy ineficiente de multiplicar dos números, especialmente porque toma un double como exponente. Math.abs no es necesario, porque elevar al cuadrado un número negativo también resultará en un valor positivo. La raíz cuadrada tampoco es necesaria cuando multiplicas circleRadius por sí mismo (elevando al cuadrado ambos lados de la comparación). Las únicas operaciones que necesitas son la suma, la resta y la multiplicación.
Si tienes la ecuación del círculo, simplemente sustituye el valor de x e y de tu punto (x, y). Después de resolver el problema, verifica si los valores obtenidos son mayores que, menores que, o iguales al valor r^2. Si es mayor, entonces el punto está fuera del círculo. Si es menor, el punto está dentro del círculo. Si es igual, el punto se encuentra en el círculo.
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.
5 votos
¿Conoces la fórmula para la distancia entre dos puntos, dadas sus coordenadas?
0 votos
Bien, definitivamente ayudaría.
3 votos
¿Dentro del radio? ¿Te refieres dentro del círculo?
0 votos
Exactamente, @PeterTamaroff.