- Una circonferenza rotola esternamente a un’altra circonferenza
- L’estremo del raggio lascia una traccia
- Il risultato finale dipende dal rapporto tra i due raggi, n=a/b
import math
import pygame
a =3 # Rapporto tra i raggi
b =2
TITOLO ="Epicicloide: a=" +str(a)+" b="+str(b)
DIM =800
dAngolo=2 # Angolo tra due punti notevoli
FRAME =60 # Numero di punti al secondo
COLOR0=( 0, 0, 0) # Colore sfondo
COLOR1=( 0, 0, 64) # Colore centrale
COLOR2=( 64, 0, 128) # Colore cerchio esterno
COLOR3=(128, 0, 255) # Colore grafico
RAGGIO1 =0.4*b/(2*a+b)*DIM
RAGGIO2 =(a/b)*RAGGIO1 # Raggio circ. rotante
RAGGIO12=RAGGIO1+RAGGIO2 # Distanza centro circ. rotante
GIRI =a # Giri necessari
GRADI =360*GIRI # Numero totale di gradi
W2 =DIM/2 # Centro dello schermo
H2 =DIM/2
CENTRO =(W2, H2)
pygame.init()
screen=pygame.display.set_mode((DIM, DIM))
pygame.display.set_caption(TITOLO)
clock=pygame.time.Clock()
pygame.time.delay(250)
PUNTI=[]
angolo=0
while angolo <= GRADI:
phi=math.radians(angolo) # Centro cerchio rotante
x12=W2+RAGGIO12*math.cos(phi)
y12=H2-RAGGIO12*math.sin(phi)
phi3=phi*(b/a) # Centro nuovo punto
x3 =x12+RAGGIO2*math.cos(phi3)
y3 =y12-RAGGIO2*math.sin(phi3)
PUNTI.append((x3,y3))
angolo += dAngolo
screen.fill(COLOR0) # Sfondo
pygame.draw.circle(screen, COLOR1, CENTRO , RAGGIO1) # Cerchio centrale
pygame.draw.circle(screen, COLOR2, (x12,y12), RAGGIO2) # Cerchio rotante
pygame.draw.line (screen, COLOR3, (x12,y12), (x3,y3), 3) # Raggio rotante
for punto in PUNTI: # Tutti i punti
pygame.draw.circle(screen, COLOR3, punto, 4)
pygame.display.flip()
clock.tick(FRAME)
pygame.time.delay(250)
screen.fill(COLOR0) # RISULTATO FINALE
pygame.draw.circle(screen, COLOR1, CENTRO, RAGGIO1)
pygame.draw.lines (screen, COLOR3, False , PUNTI, width=3)
pygame.display.flip()
input("Premi INVIO per chiudere la finestra...")
pygame.quit()
a=3, b=1
a=2, b=1
a=3, b=2
a=1, b=1
a=2, b=3
a=1, b=3