Epicicloidi

  • 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

Lascia un commento