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()