String art > Asteroidi + Salto

(Vedi Asteroidi) Il terzo vertice può essere uno a piacere tra i successivi (+1, +2, +3, …)

Web VPython 3.2
#from numpy   import linspace
#from vpython import *
 
DIM     = 800    # Dimensione della finestra
MAX     = 24     # Num. massimo vertici e tratti
MAXDIST = 1      # Ascissa / ordinata massima
VERTICI = 6
SALTO   = +2     # Vertice collegato
TRATTI  = 20     # Numero di tratti
tau     = 2*pi  
 
def linspace(start=0, stop=tau, num=50, endpoint=True):
    if(endpoint):
        step = (stop-start)/(num-1)
    else:
        step = (stop-start)/(num)
        
    return [(start+i*step) for i in range(num)]

def string_art(p1, p2, p3):
    X12 = linspace(p1[0], p2[0], num=TRATTI, endpoint=True)
    X23 = linspace(p2[0], p3[0], num=TRATTI, endpoint=True)
    Y12 = linspace(p1[1], p2[1], num=TRATTI, endpoint=True)
    Y23 = linspace(p2[1], p3[1], num=TRATTI, endpoint=True)
    gt = gcurve(color=color.blue, width=1) 
    for x12, y12, x23, y23 in zip(X12, Y12, X23, Y23):        
        gt.plot(x12, y12)
        gt.plot(x23, y23)
        gt.plot(x12, y12)

def disabilita():
    for x in RADIO1: x.disabled=True
    for x in RADIO2: x.disabled=True
    for x in RADIO3: x.disabled=True
    
def abilita():
    global SALTO
    
    for x in RADIO1: x.disabled=False
    for x in RADIO2: x.disabled=False
    
    if(VERTICI % 2 == 0): ultimo=VERTICI//2-1
    else:                 ultimo=VERTICI//2
    
    if(SALTO > ultimo):
        SALTO = ultimo
        RADIO3[SALTO-1].checked=True
        
    for i in range(ultimo):
        RADIO3[i].disabled=False
    
def disegna():
    disabilita()
    global g
    g.delete()
    g = graph(fast=False)

    g.width = g.height = DIM
    g.xmin  = g.ymin   = -1.1*MAXDIST
    g.xmax  = g.ymax   = +1.1*MAXDIST
    
    ANGOLI = linspace(start=pi/2, stop=tau+pi/2, num=VERTICI, endpoint=False)
    PUNTI  = [(MAXDIST*cos(angolo), MAXDIST*sin(angolo)) for angolo in ANGOLI]
 
    for i in range(VERTICI):
        rate(6)
        punto1 = PUNTI[i]
        punto2 = (0, 0)
        punto3 = PUNTI[(i+SALTO)%VERTICI]
        string_art(punto1, punto2, punto3)
    abilita()

def bind_vertici(evt):
    global VERTICI
    VERTICI = int(evt.text)    
    disegna()

def bind_salto(evt):
    global SALTO
    SALTO = int(evt.text)    
    disegna()

def bind_tratti(evt):
    global TRATTI
    TRATTI = int(evt.text)    
    disegna()
    
c=canvas()
c.append_to_caption("Vertici\t")
RADIO1  = []
for i in range(3, MAX//2+3):
    RADIO1.append(radio(bind=bind_vertici, name="vertici", text=str(i)))
    c.append_to_caption(" ")
c.append_to_caption("\n\t\t")
for i in range(MAX//2+3, MAX+1):
    RADIO1.append(radio(bind=bind_vertici, name="vertici", text=str(i)))
    c.append_to_caption(" ")
RADIO1[VERTICI-3].checked=True

c.append_to_caption("\nSalto?\t")
RADIO3  = []
for i in range(1, MAX//2):
    RADIO3.append(radio(bind=bind_salto, name="salto", text=str(i)))
    c.append_to_caption(" ")
RADIO3[SALTO-1].checked=True

c.append_to_caption("\nTratti\t\t")
RADIO2  = []
for i in range(3, MAX//2+3):
    RADIO2.append(radio(bind=bind_tratti, name="tratti", text=str(i)))
    c.append_to_caption(" ")
c.append_to_caption("\n\t\t")
for i in range(MAX//2+3, MAX+1):
    RADIO2.append(radio(bind=bind_tratti, name="tratti", text=str(i)))
    c.append_to_caption(" ")
RADIO2[TRATTI-3].checked=True

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

Lascia un commento