Ipocicloidi

  • 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

Lascia un commento