Skip to content

Instantly share code, notes, and snippets.

@alvesjnr
Created February 29, 2012 15:11
Show Gist options
  • Save alvesjnr/1941423 to your computer and use it in GitHub Desktop.
Save alvesjnr/1941423 to your computer and use it in GitHub Desktop.
How does a spirograph works?

Como os Espirógrafos Funcionam?

Alguns de vocês devem se perguntar: "Como os espirógrafos funcionam?". Mas a maioria de vocês perguntaria antes "espiro-o-que??".

Bem, espirógrafo é aquele brinquedo que muitos de nós usamos quando pequenos para fazer umas "espirais malucas" desenhadas no papel. O brinquedo é esse aí:

Espirografo

A mecânica do brinquedo é bem simples: uma roda dentada gira dentro de um círculo (também dentado). Sua caneta, que está presa em um orifíco da roda dentada acompanha dois movimentos distintos que são somados: o movimento circular em torno do ponto central do grande cículo (vamos chamar este ponto de O) e um movimento circular em torno do centro da roda dentada (vamos chamar o centro da roda dentada de C). Este centro, por sua vez, está em movimento. É a soma destes dois movimentos que faz surgir aqueles "desenhos muito doidos de São Tomé".

desenhos muito doidos de São Tomé

Mas o que nos interessa aqui é saber: como reproduzir estes desenhos? Ou em outras palavras: como parametrizar o dezenho, qual a matemática por trás disso? Pode não parecer, mas levantar as equações paramétricas destes traços é bem simples.

Primeiro vamos a algumas definições. Como eu não sou matemático (nem bobo) vamos colocar o centro do círculo maior na origem do nosso sistema de coordenadas. Chamamos o centro deste círculo de O (origem). Chamaremos também o Raio do círculo maior de R.

O círculo menor possui dois parâmetros importantes: o raio do círculo (que chamaremos de r) e o raio do traço, ou seja, a distância entre o centro do círculo e o ponto onde o desenho é traçado (aquele lugar que colocamos a caneta), chamamos este raio de r'. Ao centro deste círculo damos o nome de C. Ao ponto onde colocamos a caneta damos o nome de P.

Mais uma definição antes de começarmos: estamos assumindo aqui que o círculo menor translada no sentido anti-horário!

KmPlot

##Parte I - Parametrizar a posição do ponto C

Assim que começamos a traçar nossa espira, movimentamos o círculo menor no sentido anti-horário. O que vamos levantar aqui é a posição do ponto C (centro do círculo menor) em relação ao ângulo (theta).

C

Tomando a distancia entre o centro da roda dentada e o centro do círculo maior como o raio do círculo transcrito pela translação da roda menor, temos:

equ_C

Assim temos a equação paramétrica (nosso parâmetro é o ângulo theta) que retorna um ponto (x,y) para o ângulo theta.

##Parte II - Parametrizando o ponto P em relação ao ponto C

Agora que temos a posição do ponto C, vamos encontrar a posição do ponto P em relação ao ponto C. Novamente recorremos ao desenho para facilitar a explicação:

equ_Pc

Note que quando transladamos a roda menor no sentido anti-horário (theta crescente) essa mesma roda menor faz um movimento de rotação no sentido horário (phi decrescente). Isso nos leva a:

equ_Pc

O sinal negativo na equação de y se dá justamente por essa rotação no sentido horário. Para melhor visualizar imagine que começamos o desenho na seguinte posição:

equ_Pc

Neste caso temos theta=0 e phi=0. Note que assim que começamos a movimentar a roda no sentido anti-horário (aumentar theta), o ponto P tem um decréscimo do seu valor no eixo x (em relação ao ponto C, obviamente!). Por isso a parcela de y nesta segunda equação tem valor negativo.

##Parte II - Somando os movimentos

Agora que temos C em função de O e P em função de C, somamos as parcelas para obtermos P em função de O. Assim obtemos:

equ_Pc

Note que a nossa função paramétrica possui duas variáveis: theta e phi. Porém esses dois valores não são independentes, como você pode notar:

equ_Pc

O que nos leva a:

equ_Pc

Que substituindo na equação anterior temos:

equ_Pc

Por fim temos a equação final, com uma variável (theta) e três parâmetros: Raio do círculo mairo (R) raio da roda menor (r) e raio do ponto onde a caneta é colocada (r').

Logo abaixo temos um script Python que gera os traços para esses parâmetros. Note que a função geradora recebe dois parâmetros extras: spins -> quantas voltas complestas será dada para fazer o desenho. resolution -> qual o incremento do angulo theta.

Para executar este script você precisa ter a biblioteca matplotlib instalada no seu Python.

Podemos traçar também usando qualquer software de traçar gráficos que aceite equações paramétricas. Aqui temos um exemplo usandor o KmPlot no Ubuntu Linux:

KmPlot Parâmetros: R: 5 r: 1.1 r': 1 theta: variando de 0 a 2pi10 (10 voltas complestas)

Aqui um exemplo usando o GraphPlot do Mac OSX:

R: 5 r: 1.1 r': 1

E por fim dois exemplos usando o script Python listado abaixo:

Python Parâmetros: R: 5 r: 1.1 r': 1

Python Parâmetros: R: 5 r: 1.1 r': 1

import math
PI = math.pi
def give_dots(R,r,r_,resolution=2*PI/1000,spins=5):
def x(theta):
return (R - r) * math.cos( theta ) + r_* math.cos( (R - r) / r * theta )
def y(theta):
return (R - r) * math.sin( theta ) - r_* math.sin( (R - r) / r * theta )
theta = 0.0
while theta < 2*PI*spins:
yield (x(theta), y(theta))
theta += resolution
if __name__=='__main__':
from pylab import *
dots = give_dots(4,1.98,1.1, spins=45)
x,y = zip(*dots)
plot(x,y)
show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment