Epicicloidi

Una circonferenza fissa al centro di raggio a.
Una seconda circonferenza di raggio b rotola lungo il bordo esterno della prima.
L’estremo del suo raggio traccia una curva continua, un’epicloide.

Web VPython 3.2

MAX = 10

a = 3
b = 2

def mcd(c, d):
    if(d == 0): return c
    else:       return mcd(d, c % d)

def linspace(start, stop, num):
    step = (stop - start) / (num - 1)
    return [start + i * step for i in range(num)]

def disabilita(STATO):    
    for i in range(1, MAX):
        r_a[i].disabled = STATO
    for i in range(0, MAX):
        r_b[i].disabled = STATO

def disegna():
    global g, a, b
    g.delete()
    
    max_ab = 1.1*(a+2*b)

    g = graph(width = 640    , height = 640    , background = color.black,
              xmin  = -max_ab, ymin   = -max_ab,
              xmax  = +max_ab, ymax   = +max_ab)    
    
    gC = gcurve(color = color.gray(.25), width=3)
    for angolo in linspace(0, 2*pi, 60):
        x = a*cos(angolo)
        y = a*sin(angolo)
        gC.plot(x, y)
    sleep(0.5)

    gc = gcurve(color = color.gray(.75), width=3)
    def circonferenza(xc, yc, r):
        gc.data = []
        for angolo in linspace(0, 2*pi, 50):
            x = xc + r*cos(angolo)
            y = yc + r*sin(angolo)
            gc.plot(x, y)
    
    circonferenza(0, 0, a)        
    g2 = gcurve(color = color.blue, width=4)
    
    mcd_ab = mcd(a, b)
    A = a/mcd_ab
    B = b/mcd_ab
    
    START  = 0
    STOP   = B * (2*pi)
    NUMERO = 200    

    finale = []
    for angolo in linspace(START, STOP, NUMERO, endpoint = True):
        rate(30)
        x1  = (a+b)*cos(angolo)
        y1  = (a+b)*sin(angolo)
        circonferenza(x1, y1, b)
        
        angolo2 = (a+b)/b*angolo
        x2  = x1-b*cos(angolo2)
        y2  = y1-b*sin(angolo2)
        
        x3  = x1+b*cos(angolo2)
        y3  = y1+b*sin(angolo2)

        g2.data = []
        g2.plot(x2, y2)
        g2.plot(x3, y3)
    
        finale.append((x2, y2))  

        gc3 = gcurve(color = color.yellow, width = 5)
        for p in finale:
            gc3.plot(p)
    
    sleep(0.5)
    gc.data = []
    g2.data = []
    disabilita(False)

def bind_a(evt):
    global a, b
    a = int(evt.text)    
    
def bind_b(evt):
    global b
    b = int(evt.text)
    
def bind_disegna(evt):
    disabilita(True)
    disegna()
    disabilita(False)

scene.append_to_caption("R:\t")
r_a = []
for i in range(1, MAX+1):
    r_a.append(radio(bind = bind_a, name = "a", text = str(i)))
    scene.append_to_caption(" ")
r_a[a-1].checked = True

scene.append_to_caption("\t")
button(bind = bind_disegna, text = "Disegna!")

scene.append_to_caption("\nr:\t")
r_b = []
for i in range(1, MAX+1):
    r_b.append(radio(bind = bind_b, name = "b", text = str(i)))
    scene.append_to_caption(" ")
r_b[b-1].checked = True

scene.append_to_caption("\n\n")
scene.delete()
g = graph()
disegna()

Lascia un commento