4 votos

Rotación circular

Estoy tratando de emular la rotación planetaria. Tengo un 'planeta' que gira alrededor del 'sol', pero cuando intento hacer girar la 'luna' alrededor del 'planeta', el movimiento está sesgado.

Si detengo el movimiento del "planeta", la rotación está bien. Creo que esto está fuera de mi entendimiento.

Tengo una demostración en http://jsfiddle.net/btW7j/

6voto

lowglider Puntos 562

¡Vaya, es un efecto muy bonito! Lo que sucede es esto:

  1. En primer lugar, se gira la luna alrededor del planeta en algún ángulo, digamos, $\alpha$ .
  2. Entonces se gira el planeta alrededor del sol en algún ángulo, digamos, $\beta$ .
  3. Ahora, trata de girar la luna alrededor del planeta por el ángulo $\alpha$ de nuevo... ¡pero el planeta se ha movido mientras tanto!

Así, se obtiene el efecto que se ve en tu demostración: la velocidad absoluta de la luna es proporcional a su distancia del planeta, por lo que cuando la luna está cerca, se mueve más lentamente que el planeta y por lo tanto se queda atrás. Pero eso la aleja del planeta y la hace moverse más rápido, por lo que la alcanza de nuevo, pero entonces su órbita la lleva delante del planeta, por lo que sus trayectorias convergen y se acercan de nuevo. De este modo, se obtienen estas trayectorias en forma de espirógrafo.

Variar la proporción $\alpha/\beta$ cambia la trayectoria; $\alpha/\beta > 1$ da efectos similares a los observados, mientras que si $\alpha/\beta = 1$ La luna se escapa al infinito y nunca vuelve. Para $0 < \alpha/\beta < 1$ el planeta alcanza a la luna después de completar una rotación extra alrededor del sol, mientras que $\alpha/\beta < 0$ hace que la luna se sumerja hacia dentro, más cerca del sol (y, por $-1 < \alpha/\beta < 0$ para trazar patrones cuasi-poligonales nítidos mientras lo hace).

De todos modos, la solución es bastante simple: después de girar el planeta alrededor del sol, gire también la luna alrededor del sol en el mismo ángulo ( jsFiddle ):

function do_rotation() {
    moon.attr(rotate(get_point(moon), get_point(earth), 5));
    earth.attr(rotate(get_point(earth), get_point(sun), 1));
    moon.attr(rotate(get_point(moon), get_point(sun), 1));  // <- NEW

    setTimeout(do_rotation, 1000 / 60);
}

Así, el planeta y la luna se mantienen a la misma distancia el uno del otro. Como efecto secundario, la velocidad de rotación de la luna alrededor del planeta, desde un punto de vista no rotatorio, se convierte en $\alpha + \beta$ en lugar de sólo $\alpha$ . Si no quieres eso, simplemente resta el ángulo de rotación del planeta al de la luna.

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