- Una circonferenza rotola internamente 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 =5 # Rapporto tra i raggi
b =2
TITOLO ="Ipocicloide: 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
if(a/b <= 1): # Raggio circ. centrale
RAGGIO1=0.4*DIM
else:
RAGGIO1=0.4*b/(2*a-b)*DIM
RAGGIO2=RAGGIO1/b*a # Raggio circ. rotante
RAGGIO3=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+RAGGIO3*math.cos(phi)
y12=H2-RAGGIO3*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)
if(a/b <= 1):
pygame.draw.circle(screen, COLOR1, CENTRO, RAGGIO1)
pygame.draw.circle(screen, COLOR2, (x12,y12), RAGGIO2)
if(a/b > 1):
pygame.draw.circle(screen, COLOR1, CENTRO, RAGGIO1)
pygame.draw.line(screen, COLOR3, (x12,y12), (x3,y3), 3)
for punto in 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=2, b=3
a=1, b=2
a=1, b=3