Spirograph
Cercando qualcosa da fare in giro per la rete, durante le vacanze di natale mi è venuto in mente un vecchio gioco che facevo da ragazzino.
Lo Spirografo.
Un gioco.. o meglio.. uno strumento simpatico che permetteva di disegnare delle forme simili a spirali (Hypocyclod) mediante il tracciamento di un punto su una rondella fatta ruotare all’interno di una ruota dentata più grande.
All’inizio non ho pensato che esistesse una formula per realizzare quelle figure.. poi mi è venuto in mente di cercare qualcosa online. E ho trovato che le figure disegnare con quello strumento appartengono a una famiglia di curve disegnate da:
$$ x(t) = (R+r)\cos(t) + p\cos(\left(R+r\right)\frac{t}{r}) $$
$$ y(t) = (R+r)\sin(t) + p\sin(\left(R+r\right)\frac{t}{r}) $$
Formule grazie alle quali si possono disegnare grafici più o meno complessi, a seconda del tipo di parametri $$R$$ e $$r$$ impostati.
Alcuni esempi:





Per sviluppare il disegno ho implementato un sistema di tracciamento punti sfruttando la classe GeneralPath grazie alla quale è stato poi possibile effettuare, con delle trasformazioni affini, la centratura della Shape così diegnata.
La GeneralPath fornisce una figura geometrica formata dall’unione di tutti i punti inseriti in modo: lineare, quadratico e cubico. Dato che ho fornito un numero di punti per radiante molto elevato, il disegno dell’ipocicloide è venuto (con varie approssimazioni) abbastanza preciso.
Questo è il codice che ho implementato per il tracciamento dei punti:
for (float rad=0; rad<=6*Math.PI; rad+=Math.toRadians(1)/100) { double R = 200; double r = 20; double Rr = R + r; double p = 30; float x = (float)(Rr*Math.cos(rad) + (p * Math.cos(Rr * (rad/r)))); float y = (float)(Rr*Math.sin(rad) + (p * Math.sin(Rr * (rad/r)))); }
Aggiungo, per chi volesse giocarci su, anche il programma in formato JAR.
Spirograph.jar
