Comprei um espirógrafo, para analisar melhor as curvas que este produz (são diferentes das que eu tinha feito antes).
Segue a implementação descrita a seguir, em versão web: https://asgunzi.github.io/Espirografos/.

Fiz algumas figuras para entender a lógica deste – vide o scan abaixo.

Esquematicamente, imagine um círculo menor rodando dentro de um círculo maior.

Além disso, dentro do círculo menor, escolho a posição do ponto onde coloco a caneta, representada pelo círculo vermelho abaixo.
A posição inicial do círculo menor é dada pelo círculo verde abaixo.
O raio do círculo maior é R, o do círculo menor que roda dentro do círculo maior é r2.
A posição da caneta pode ser descrita por um raio r3, e um ângulo lambda em relação ao centro do círculo menor no início da rotação.

Imagine que o círculo menor rodou um ângulo theta em relação ao círculo maior.
A posição do CENTRO do círculo menor vai ser dada pelas equações da figura – até agora, nenhuma novidade, são equações de um círculo.
A posição inicial do círculo, em verde, mudou, porque girou com o círculo.

O ângulo phi, do deslocamento da posição inicial, é obtido notando que o arco da circunferência maior tem a mesma dimensão do arco da circunferência do círculo menor.
Um arco de circunferência é dado por R*ângulo, onde o ângulo é medido em radianos.
Assim, R*theta = r2*phi.
Ou seja, phi = R*theta / r2.
Se o raio menor r2 for pequeno, phi é maior, ou seja, vai ter que girar mais vezes para chegar ao mesmo ponto.

Agora, finalmente, temos que encontrar a posição da caneta (a bola vermelha). Lembrando, ela estava a um ângulo lambda da posição inicial, e num raio r3.
Portanto, o ângulo até o ponto de tangência entre os dois círculos é (phi – lambda), onde phi = R*theta / r2.

As equações finais têm que levar em consideração a posição inicial do círculo maior, o centro do círculo menor, e a rotação descrita acima.
X = x0 + (R-r2)*Math.sin(theta)-r3*Math.sin(theta*R/r2 - phi));
Y = y0 + (R-r2)*Math.cos(theta)-r3*Math.cos(theta*R/r2 - phi));
Fiz a implementação utilizando a excelente biblioteca D3 de Javascript.
Para o raio maior, utilizei o valor arbitrário de 200. Os outros parâmetros são o raio menor (r2), a posição da caneta (r3) e o número de voltas que o círculo menor dá em torno do maior.
Seguem alguns resultados.
Com os parâmetros descritos, e 1 volta.

2 voltas:

Chega uma hora que não adianta mais dar voltas, que elas coincidem na mesma trajetória.

Outros exemplos:





Nota: o ângulo lambda foi desprezado, no final das contas, porque apenas desloca um pouco o ângulo, sem mudar o formato da figura.
Vide a implementação citada aqui: https://asgunzi.github.io/Espirografos/.
A dança das estrelas
As curvas desenhadas acima lembram as curvas que os planetas fazem no céu, vistos da Terra.

Imagine que a Terra é o círculo menor, girando ao redor do Sol, o círculo maior. A Terra também gira em torno de si mesma. Agora, um outro planeta, Vênus, também gira ao redor do Sol numa velocidade diferente.
Certamente, a equação dos planetas é muito mais complexa: é em três dimensões, as órbitas são elípticas, e o outro planeta gira em torno do Sol também. Porém, a ideia geral é mais ou menos semelhante: uma composição de rotações em torno de rotações de rotações, ora fazendo a posição aparente ir para frente, ora para trás, numa eterna dança celestial…
Trilha sonora: O segundo sol, Cássia Eller
“Quando o segundo sol chegar, para realinhar as órbitas dos planetas…”
Vide também:
https://ideiasesquecidas.com/2015/03/03/a-danca-de-afrodite/
https://ideiasesquecidas.com/2017/07/05/plutao-e-a-falacia-narrativa/
Republicou isso em Forgotten Math.
CurtirCurtir