2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								"""
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								sketch 51 180220 - Alexandre B A Villares
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								https://abav.lugaralgum.com/sketch-a-day
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								"""
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								import random as rnd
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								CEL_SIZE = 64
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								HALF_CEL = CEL_SIZE / 2
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								MARGIN = 100
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								GRADE_PONTOS = []  # lista de tuplas (x, y) / list of tuples
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								NUM_NODES = 30  # número de elementos do desenho / number of nodes
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								DESENHO = []  # lista de tuplas dos elementos/'nós' do desenho
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              # (x, y, diâmetro, espessura, se é seta, pra quem aponta)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								def setup():
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    size(712, 712)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    noFill()
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    # calcula uma região do canvas dentro das margens / canvas - margin
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:09:37 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    h, w = height - 2 * MARGIN, width - 2 * MARGIN
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    # calcula número de filas e colunas de 'células' de uma grade
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    n_rows, n_cols = int(h / CEL_SIZE), int(w / CEL_SIZE)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    # populalista com grade de pontos dos centros das 'células'
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    # populates a list of points in a grid according to CEL_SIZE
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    for r in range(n_rows):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        for c in range(n_cols):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            x, y = HALF_CEL + c * CEL_SIZE,\
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                HALF_CEL + r * CEL_SIZE
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            GRADE_PONTOS.append((x + MARGIN, y + MARGIN))  # acrescenta ponto
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:09:37 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    # chama o procedimento que gera um desenho
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    novo_desenho()
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    println("'s' to save, and 'n' for a new drawing")
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								def novo_desenho():
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    # esvazia a lista elementos (setas e linhas) de desenho anterior
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    # clears the list of nodes (drawing elements: arrows & lines)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    DESENHO[:] = []
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:09:37 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    for _ in range(NUM_NODES):
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        # sorteia um ponto da grade (unpack x, y)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        x, y = rnd.choice(GRADE_PONTOS)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        DESENHO.append((  # acrescenta elemento/"nó" uma tupla com:
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            x,  # x
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            y,  # y
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # circle size (sorteia um tamanho de círculo)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            rnd.choice([10, 20, 30]),
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            rnd.choice([2, 4, 6]),  # strokeWeight (espessura da linha)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            rnd.choice([True, False]),  # arrow (se é seta)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # other nodes (nesta lista pode ser posta ref. a outro elem.))
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            list()
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        ))
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:09:37 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    for node in DESENHO:  # para cada elemento do desenho
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        rnd_node = rnd.choice(DESENHO)  # sorteia outro elemento
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        x1, y1, x2, y2 = node[0], node[1], rnd_node[0], rnd_node[1]
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        # compara coordenadas, se não for no mesmo ponto
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if (x1, y1) != (x2, y2):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            # 'aponta' para este elemento, acrescenta na sub_lista
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            node[-1].append(rnd_node)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # pode acontecer de um elemento não apontar para ninguém
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            # caso ele mesmo tenha sido sorteado, ou um outro na mesma posição
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								def seta(x1, y1, x2, y2, shorter=12, head=12):
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    """
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    O código para fazer as setas, dois pares (x, y),
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    um parâmetro de encurtamento: shorter
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    e para o tamanho da cabeça da seta: head
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    """
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    L = dist(x1, y1, x2, y2)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    with pushMatrix():
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        translate(x2, y2)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        angle = atan2(x1 - x2, y2 - y1)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        rotate(angle)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        offset = -shorter * .6
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        line(0, offset, 0, -L - offset)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        line(0, offset, -head / 3, -head + offset)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        line(0, offset, head / 3, -head + offset)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								def draw():
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    background(200)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    # para cada elemento do desenho, pegue as coordenandas e atributos
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    for x1, y1, d1, sw, arrow, points_to in DESENHO:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        strokeWeight(sw)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 23:07:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        for other in points_to:  # se estiver apontando para alguém
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            # pega as coordenadas do outro elemento
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            x2, y2 = other[0], other[1]
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            if arrow:   # se for arrow == True, desenhe seta preta apontando
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                stroke(0)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                # x1, y1, x2, y2, circle offset, arrow head size
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                seta(x1, y1, x2, y2, d1, sw * 5)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            else:   # senão desenhe linha branca até ele
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								                stroke(255)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								                line(x1, y1, x2, y2)
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:20:01 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        ellipse(x1, y1, d1, d1)  # desenha o círculo
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 10:45:27 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								def keyPressed():
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    if key == 's':
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        saveFrame("####.png")
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    if key == 'n':
							 | 
						
					
						
							
								
									
										
										
										
											2018-02-20 11:01:42 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        novo_desenho()
							 |