kopia lustrzana https://github.com/villares/sketch-a-day
129 wiersze
3.6 KiB
Python
129 wiersze
3.6 KiB
Python
"""
|
|
sketch 64 180395 - Alexandre B A Villares
|
|
https://abav.lugaralgum.com/sketch-a-day
|
|
"""
|
|
import random as rnd
|
|
|
|
LIST = []
|
|
SRINK = .50
|
|
OFFSET = .25
|
|
SIZE = 236 # base size
|
|
SAVE_FRAME = False
|
|
NODE_DRAW = [rect,
|
|
ellipse,
|
|
]
|
|
|
|
def setup():
|
|
size(512 + 200, 512 + 200)
|
|
rectMode(CENTER)
|
|
colorMode(HSB)
|
|
strokeWeight(2)
|
|
LIST.append(Cell())
|
|
|
|
def draw():
|
|
translate(width / 2, height / 2)
|
|
background(200)
|
|
for cell in LIST:
|
|
cell.update()
|
|
save_frame() # saves frame if SAVE_FRAME is set True
|
|
|
|
def keyPressed():
|
|
global SAVE_FRAME, DRAW_F, SRINK, OFFSET
|
|
if key == " ":
|
|
LIST[:] = [Cell()]
|
|
SRINK = .50
|
|
OFFSET = .25
|
|
if key == "r":
|
|
NODE_DRAW.append(NODE_DRAW.pop(0)) # circles drawing functions list
|
|
SAVE_FRAME = True
|
|
|
|
|
|
class Cell():
|
|
|
|
def __init__(self, x=0, y=0, gen=0):
|
|
self.LIST = []
|
|
self.x, self.y = x, y
|
|
self.gen = gen
|
|
self.color = color(random(0, 200), 200, 200, 200)
|
|
|
|
def s(self): # size
|
|
return SIZE * (SRINK ** self.gen)
|
|
|
|
def update(self):
|
|
global SAVE_FRAME
|
|
self.draw() # draws itself
|
|
if not self.LIST:
|
|
# if random(100) < 7 / (self.gen + 1):
|
|
# self.divide()
|
|
# SAVE_FRAME = True
|
|
if mousePressed and self.on_mouse():
|
|
self.divide() # will create new sub-cells
|
|
SAVE_FRAME = True
|
|
# otherwise will recursively update sub-cells and draw a line to them
|
|
else:
|
|
for sub_cell in self.LIST:
|
|
sub_cell.update()
|
|
if self.gen % 2:
|
|
stroke(0)
|
|
else:
|
|
stroke(255)
|
|
strokeWeight((6-self.gen))
|
|
seta(self.x, self.y, sub_cell.x, sub_cell.y,
|
|
sub_cell.s(), tail_func=ellipse,
|
|
tail_size=sub_cell.s() )
|
|
|
|
def draw(self):
|
|
noStroke()
|
|
fill(self.color)
|
|
NODE_DRAW[0](self.x, self.y, self.s(), self.s())
|
|
noFill()
|
|
#NODE_DRAW[0](self.x, self.y, 4, 4)
|
|
#text(str(self.gen), self.x, self.y)
|
|
|
|
def divide(self):
|
|
if self.gen < 6:
|
|
x, y = self.x, self.y
|
|
new_gen = self.gen + 1
|
|
o = self.s() * OFFSET * new_gen
|
|
self.LIST.append(Cell(x + o, y + o, gen=new_gen))
|
|
self.LIST.append(Cell(x + o, y - o, gen=new_gen))
|
|
self.LIST.append(Cell(x - o, y + o, gen=new_gen))
|
|
self.LIST.append(Cell(x - o, y - o, gen=new_gen))
|
|
#self.gen = new_gen
|
|
|
|
def on_mouse(self):
|
|
x, y = self.x + width / 2, self.y + height / 2
|
|
r = self.s() / 2
|
|
if (x - r < mouseX < x + r and
|
|
y - r < mouseY < y + r):
|
|
return True
|
|
|
|
|
|
def save_frame():
|
|
global SAVE_FRAME
|
|
if SAVE_FRAME:
|
|
SAVE_FRAME = False
|
|
#if frameCount < 600: #and not frameCount % 3:
|
|
saveFrame("48-######.tga")
|
|
|
|
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 / 5, 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) |