Autor Tema: Obtener punto al azar del perímetro de una elipse o rectángulo.

0 Usuarios y 1 Visitante están viendo este tema.

14 Agosto, 2025, 01:54 pm
Leído 9408 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Si elipse es muy complicado será rectángulo.

Quiero imitar una nube cambiando, más o menos. Circulos aparecerían detrás, crecerían y se achicarían hasta desaparecer. Hay un video que me gustó que más o menos hace eso pero no lo encuentro.

Entonces, tenemos una elipse de 200 de ancho y 100 de alto. Supongamos que está colocado en las coordenadas 0, 0. ¿Cómo los circulos podrían aparecer en cualquier parte del perímetro con igual probabilidad? No en el área.

Si es muy complicado, tenemos un rectángulo, digamos de la misma medida y lugar. Y misma pregunta.
Sobre este lo pensé y no supe. Puedo hacer que aparezca en el perímetro, pero con igual chance cada punto no sé.

14 Agosto, 2025, 04:11 pm
Respuesta #1

martiniano

  • Moderador Global
  • Mensajes: 2,327
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Todo depende un poco de a qué te refieres con igual probabilidad. Te comento algunas opciones ordenadas por grado de dificultad.

Una elipse de ejes paralelos a los de coordenadas admite una parametrización tipo:

\[ x=a\cos t \]
\[ y=b\sin t \]
\[ t\in{[0,2\pi)} \]

Entonces si haces que \[ t \] sea una variable uniforme \[ U(0,2\pi) \] pues ya tendrías puntos de la elipse.

El problema es que geométricamente aquí \[ t \] no representa el perímetro de la elipse desde una cierta referencia. Si lo haces así seguramente tendrás la sensación de que hay zonas más probables que otras. Cuanto mayor sea la excentricidad de la elipse más se acusará este problema.

Si no te gusta esto seguramente tendrás que aproximar la elipse mediante una línea poligonal, elegir un punto de esa línea, y luego llevar ese punto a la elipse de alguna manera.

Otra opción es sacar el perímetro de la elipse por métodos numéricos, multiplicarlo por una variable uniforme \[ U(0,1) \], y después sacar, también por métodos numéricos, el punto asociado a ese valor del parámetro natural. Seguramente esto será lo más costoso computacionalmente hablando y también lo más difícil de programar dependiendo de qué funciones tengas ya hechas.

Personalmente me quedaría con la segunda opción, pero prueba tú y elige cómo te gusta más.

Un saludo.

24 Agosto, 2025, 03:56 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Todo depende un poco de a qué te refieres con igual probabilidad.
Si el perímetro es 100 píxeles, que en teoría en 100 tiradas se marque cada píxel de esos...

Citar
El problema es que geométricamente aquí \[ t \] no representa el perímetro de la elipse desde una cierta referencia. Si lo haces así seguramente tendrás la sensación de que hay zonas más probables que otras. Cuanto mayor sea la excentricidad de la elipse más se acusará este problema.
Imagino que excentricidad se refiere a cuan diferente es de un circulo.

Pruebo.

Imagino que debe ser algo como:
t = Math.random()*2/pi
Math.random resulta entre 0 y 1, o sea, puede ser un número intermedio también.

¿Pero qué son a y b aquí?
\[ x=a\cos t \]
\[ y=b\sin t \]

¿y t está multiplicando o es como "cos de t"? Es que no sé de esas cosas.

En cuanto a la 2nda opción, tampoco sé cómo hacerla.

Lo más parecido que se me ocurrió fue elegir un número al azar de 0 a 3 (son 4), lo cual sería elegir una curva (una elipse son 4 curvas iguales pero rotadas distinto), luego elijo una X, y luego el Y asociado, pero tampoco sé hacerlo. ¿Cómo se calcula el Y, cual es la función? Además como son 4 curvas capaz que preciso saber 4 funciones...

GPT sobre la de arriba izquierda me dijo:
"Concretamente, para a = 100 y b = 50:
y(x) = 50 · sqrt(1 − (x/100)^2)"


Para un rectángulo mi solución sería más o menos:
- Calcular perímetro.
- Elegir número al azar en esa cantidad.
- Yo sabría cuánto mide de largo y alto, ponele que 200 y 100. Entonces:
- Si el número elegido es <201, pertenece a la línea de arriba. La coordenada será (el número), -50. Ese -50 es suponiendo que el rectángulo está ubicado en el Y 0, lo que estoy indicando es que el punto elegido estará arriba.
- sino si el número es <301, pertenece a la línea de la izquierda. La coordenada es -100, (el número-201).
- sino si el número es <401, pertenece a la línea de la derecha. La coordenada será 100, (el número-301).
- sino pertenece a la línea de abajo. La coordenada será (el número-401), 50.

Creo que los puntos en las esquinas, salvo la derecha abajo, tienen el doble de probabilidad, habría que mejorarlo.


Probé la fórmula de GPT o parecido y va bien  :-*
¿Ven que aparecen circulos en la curva inferior derecha?
Necesito las funciones para las otras 3.
Código: [Seleccionar]
onClipEvent (load) {
Globos = 0;
}
onClipEvent (enterFrame) {
x = random(101);
y = 50*Math.sqrt(1-Math.pow(x/100, 2));
Globos++;
if (Globos > 100) {
Globos = 1;
}
Name = "Globo"+Globos;
attachMovie("sGlobo", Name, Globos);
setProperty (Name, _x, x );
setProperty (Name, _y, y );
}
Repito que la elipse es de 200 de ancho y 100 de altura.

24 Agosto, 2025, 08:37 am
Respuesta #3

martiniano

  • Moderador Global
  • Mensajes: 2,327
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Imagino que excentricidad se refiere a cuan diferente es de un circulo.

Sí.

Imagino que debe ser algo como:
t = Math.random()*2/pi
Math.random resulta entre 0 y 1, o sea, puede ser un número intermedio también.

Si consideras que Math.random() devuelve una variable uniforme, entonces correcto.

¿Pero qué son a y b aquí?
\[ x=a\cos t \]
\[ y=b\sin t \]

Son el semieje horizontal y vertical de la elipse. Si la elipse se inscribe en un rectángulo 200x100 pues sería la mitad.

\[ a=100 \]
\[ b=50 \]


¿y t está multiplicando o es como "cos de t"?

\[ \cos t \] es el coseno de t.

Saludos.

08 Septiembre, 2025, 11:15 pm
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
El método que estaba usando me parecía más simple, pero no logro que GPT me de las fórmulas bien y yo no sé. Me faltan las fórmulas para las curvas de la izquierda.
Código: [Seleccionar]
onClipEvent (load) {
Globos = 0;
}
onClipEvent (enterFrame) {
Curva = random(2);
if (Curva == 0) {
    // Arriba-derecha:
    x = random(101);
    y = -50*Math.sqrt(1-Math.pow(x/100, 2));
} else {
    // Abajo-derecha:
x = random(101);
y = 50*Math.sqrt(1-Math.pow(x/100, 2));
}
Globos++;
if (Globos > 100) {
Globos = 1;
}
Name = "Globo"+Globos;
attachMovie("sGlobo", Name, Globos);
setProperty (Name, _x, x );
setProperty (Name, _y, y );
}

Insiste conque x sea negativo, pero al automultiplicarse queda positivo, no sirve, o no lo estoy entendiendo.


Intenté usar tus sugerencias consultando también porque cos y sin ni sé cómo se usa. Puse:
Código: [Seleccionar]
onClipEvent (load) {
Globos = 0;
}
onClipEvent (enterFrame) {
t = random(Math.PI*2);
x = 100 * Math.cos(t);
y = 50 * Math.sin(t);
Globos++;
if (Globos > 100) {
Globos = 1;
}
Name = "Globo"+Globos;
attachMovie("sGlobo", Name, Globos);
setProperty (Name, _x, x );
setProperty (Name, _y, y );
}

Resultado: Sólo aparecen 6 globos, siempre en los mismos 6 sitios:


¡Pero ya vi cómo es! Tras algunas pruebas...
t = Math.random()*Math.PI*2;

 :aplauso:

09 Septiembre, 2025, 01:27 pm
Respuesta #5

martiniano

  • Moderador Global
  • Mensajes: 2,327
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola.

Imagino que debe ser algo como:
t = Math.random()*2/pi
Math.random resulta entre 0 y 1, o sea, puede ser un número intermedio también.

Si consideras que Math.random() devuelve una variable uniforme, entonces correcto.

Ahora veo que el problema quizás fuera que aquí te confirmé esta línea. Resulta que cuando vi /pi leí \pi y me confundí con la manera con que se introducen letras griegas en latex.

Un saludo.