sketch-a-day/s307/s307.pyde

136 wiersze
3.8 KiB
Python

# Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day
SKETCH_NAME = "s306" # 20181031
OUTPUT = ".png"
GRID_SIZE = 24
from line_geometry import Line
from line_geometry import par_hatch
rule = lambda x, y: (x - y) % 3 == 0 and (x + y) % 3
def setup():
global xo, yo
size(500, 500)
smooth(8)
init_grid(GRID_SIZE)
def draw():
background(200)
stroke(0)
for c in Cell.cells:
c.plot()
# for p in Node.nodes:
# if rule(p.ix, p.iy):
# if dist(p.x, p.y, mouseX, mouseY) < 5:
# stroke(255, 0, 0)
# else:
# stroke(255)
# ellipse(p.x, p.y, 10, 10)
def init_grid(grid_size):
Cell.border = 50.
Cell.spacing = (width - Cell.border *2) / grid_size
Cell.cells = []
for x in range(0, grid_size, 2):
for y in range(0, grid_size, 2):
new_cell = Cell(x, y)
Cell.cells.append(new_cell)
Cell.grid[x, y] = new_cell
Node.nodes = []
for x in range(-1, grid_size+1, 2):
for y in range(-1, grid_size+1, 2):
new_node = Node(x, y)
Node.nodes.append(new_node)
Cell.grid[x, y] = new_node # extrarir do dict
for c in Cell.cells:
c.update_vers()
class Node():
nodes = []
grid = dict()
def __init__(self, x, y):
self.ix = x
self.iy = y
self.px = Cell.border + Cell.spacing + x * Cell.spacing
self.py = Cell.border + Cell.spacing + y * Cell.spacing
if rule(x, y):
mx, my = width/2, height/2
qx = -1 * (self.px - mx) / (abs(self.px - mx) + 0.001)
qy = -1 * (self.py - my) / (abs(self.py - my) + 0.001)
self.px += sqrt(abs(self.px - mx)) * qx
self.py += sqrt(abs(self.py - my)) * qy
self.x = self.px
self.y = self.py
self.v = PVector(self.x, self.y)
class Cell():
cells = []
grid = dict()
vers = []
def __init__(self, x, y):
self.ix = x
self.iy = y
self.px = Cell.border + Cell.spacing + x * Cell.spacing
self.py = Cell.border + Cell.spacing + y * Cell.spacing
self.vers = []
self.num_hatches = int(random(5, 12))
self.type_hatches = random(10)
def plot(self):
self.hatch()
strokeWeight(1)
for l in self.lines:
l.plot()
beginShape()
noFill()
strokeWeight(2)
for p in self.vers:
vertex(p.v.x, p.v.y)
endShape(CLOSE)
def update_vers(self):
self.v0 = Cell.grid.get((self.ix-1, self.iy-1))
self.v1 = Cell.grid.get((self.ix-1, self.iy+1))
self.v3 = Cell.grid.get((self.ix+1, self.iy-1))
self.v2 = Cell.grid.get((self.ix+1, self.iy+1))
# if random(10) > 2:
self.vers = [self.v0, self.v1, self.v2, self.v3]
def hatch(self):
self.lines = []
n = self.num_hatches
r = self.type_hatches
if r > 2:
self.lines.extend(par_hatch(self.vers, n, 0))
if r < 8:
self.lines.extend(par_hatch(self.vers, n, 1))
def keyPressed():
if key == "n":
init_grid(GRID_SIZE)
if key == "s": saveFrame("###.png")
def mouseDragged():
for p in Node.nodes:
if rule(p.ix, p.iy):
if dist(p.x, p.y, mouseX, mouseY) < 5:
p.x, p.y = mouseX, mouseY
p.v = PVector(p.x, p.y)
# print text to add to the project's README.md
def settings():
println(
"""
![{0}]({0}/{0}{2})
{1}: [code](https://github.com/villares/sketch-a-day/tree/master/{0}) [[Py.Processing](https://villares.github.io/como-instalar-o-processing-modo-python/index-EN)]
""".format(SKETCH_NAME, SKETCH_NAME[1:], OUTPUT)
)