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 graficoif(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=0while 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()