kopia lustrzana https://github.com/villares/sketch-a-day
				
				
				
			
		
			
				
	
	
		
			129 wiersze
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			129 wiersze
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
"""
 | 
						|
sketch 63 180304 - Alexandre B A Villares
 | 
						|
https://abav.lugaralgum.com/sketch-a-day
 | 
						|
"""
 | 
						|
 | 
						|
STROKE_W = [10, 5, 4, 3, 2, 1]
 | 
						|
 | 
						|
def setup():
 | 
						|
    size(500, 500)
 | 
						|
    rectMode(CENTER)
 | 
						|
    generate()
 | 
						|
 | 
						|
def draw():
 | 
						|
    background(128)
 | 
						|
    noFill()
 | 
						|
    translate(width / 2, height / 2)
 | 
						|
    for c in nodes:
 | 
						|
        c.update()
 | 
						|
    for c in nodes:
 | 
						|
        c.plot()
 | 
						|
    for c in nodes:
 | 
						|
        if random(10) > 9.99 or len(nodes) < 2:  # c.isOn(mouseX, mouseY):
 | 
						|
            if c.gen < 5:
 | 
						|
                c.sub()
 | 
						|
                break
 | 
						|
    #if not frameCount % 10: saveFrame("###.tga") # para salvar frames
 | 
						|
 | 
						|
def keyPressed():
 | 
						|
    generate()
 | 
						|
 | 
						|
def generate():
 | 
						|
    global nodes
 | 
						|
    nodes = []
 | 
						|
    nodes.append(Node(0, 0, 400))
 | 
						|
 | 
						|
 | 
						|
class Node:
 | 
						|
    def __init__(self, x, y, s):
 | 
						|
        self.edges = set()
 | 
						|
        self.x = x
 | 
						|
        self.y = y
 | 
						|
        self.ix = x
 | 
						|
        self.iy = y
 | 
						|
        self.s = s
 | 
						|
        colorMode(RGB)
 | 
						|
        self.ncol = color(255, 0, 0)
 | 
						|
        colorMode(HSB)
 | 
						|
        self.col = color(random(256), 200, 200)
 | 
						|
        self.gen = 0
 | 
						|
 | 
						|
    def update(self):
 | 
						|
        self.x = lerp(self.x, self.ix, 0.09)
 | 
						|
        self.y = lerp(self.y, self.iy, 0.09)
 | 
						|
        self.col = lerpColor(self.col, self.ncol, 0.05)
 | 
						|
 | 
						|
    def plot(self):
 | 
						|
        strokeWeight(STROKE_W[self.gen])
 | 
						|
        if self.edges:
 | 
						|
            for e in self.edges:
 | 
						|
                stroke(self.col)
 | 
						|
                ellipse(self.x, self.y, self.s / 5, self.s / 5)
 | 
						|
                if self.gen % 2:
 | 
						|
                    stroke(0)
 | 
						|
                else:
 | 
						|
                    stroke(255)
 | 
						|
                seta(e.x, e.y, self.x, self.y, self.s / 4,
 | 
						|
                     None, rect, tail_size=self.s / 4)
 | 
						|
        #text(str(self.gen), self.x, self.y)
 | 
						|
 | 
						|
    def isOn(self, mx, my):
 | 
						|
        return dist(self.x,
 | 
						|
                    self.y,
 | 
						|
                    mx,
 | 
						|
                    my) < self.s / 2
 | 
						|
 | 
						|
    def sub(self):
 | 
						|
        ms = self.s * 0.5
 | 
						|
        mms = ms / 2
 | 
						|
        c0 = Node(self.ix - mms, self.iy + mms, ms)
 | 
						|
        c0.edges = self.edges
 | 
						|
        c0.gen = self.gen + 1
 | 
						|
        # replace egges from any child
 | 
						|
        for c in nodes:
 | 
						|
            if self in c.edges:
 | 
						|
                c.edges.remove(self)
 | 
						|
                c.edges.add(c0)
 | 
						|
        nodes.append(c0)
 | 
						|
        c1 = Node(self.ix - mms, self.iy - mms, ms)
 | 
						|
        c1.x = self.ix 
 | 
						|
        c1.y = self.iy 
 | 
						|
        c1.gen = self.gen + 1
 | 
						|
        c1.edges.add(c0)
 | 
						|
        nodes.append(c1)
 | 
						|
        c2 = Node(self.ix + mms, self.iy - mms, ms)
 | 
						|
        c2.x = self.ix
 | 
						|
        c2.y = self.iy
 | 
						|
        c2.gen = self.gen + 1
 | 
						|
        c2.edges.add(c0)
 | 
						|
        nodes.append(c2)
 | 
						|
        c3 = Node(self.ix + mms, self.iy + mms, ms)
 | 
						|
        c3.x = self.ix
 | 
						|
        c3.y = self.iy
 | 
						|
        c3.gen = self.gen + 1
 | 
						|
        c3.edges.add(c0)
 | 
						|
        nodes.append(c3)
 | 
						|
        nodes.remove(self)
 | 
						|
 | 
						|
def seta(x1, y1, x2, y2, shorter=0, head=None,
 | 
						|
         tail_func=None, tail_size=None):
 | 
						|
    """
 | 
						|
    Seta means arrow in Portuguese
 | 
						|
    """
 | 
						|
    L = dist(x1, y1, x2, y2)
 | 
						|
    if not head:
 | 
						|
        head = max(L / 10, 5)
 | 
						|
    with pushMatrix():
 | 
						|
        translate(x1, y1)
 | 
						|
        angle = atan2(x1 - x2, y2 - y1)
 | 
						|
        rotate(angle)
 | 
						|
        offset = shorter / 2
 | 
						|
        strokeCap(ROUND)
 | 
						|
        if L > head:
 | 
						|
            line(0, L - offset, -head / 3, L - offset - head)
 | 
						|
            line(0, L - offset, head / 3, L - offset - head)
 | 
						|
            strokeCap(SQUARE)
 | 
						|
            line(0, offset, 0, L - offset)
 | 
						|
        if tail_func and tail_size:
 | 
						|
            tail_func(0, 0, tail_size, tail_size)
 |