villares 2020-02-09 22:01:38 -03:00
rodzic 07c7aa4a7f
commit 0c82451aab
9 zmienionych plików z 294 dodań i 0 usunięć

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 26 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 23 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 41 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 47 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 26 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 37 KiB

Wyświetl plik

@ -0,0 +1,146 @@
def create_points(non_intersecting=True):
background(200)
done = False
while not done:
poly_points = [PVector(random(BORDER, width - BORDER),
random(BORDER, height - BORDER)
)
for _ in range(NUM)]
ed = edges(poly_points)
done = True
if non_intersecting:
for p1, p2 in ed[::-1]:
for p3, p4 in ed[2::]:
# test only non consecutive edges
if (p1 != p3) and (p2 != p3) and (p1 != p4):
if line_instersect(Line(p1, p2), Line(p3, p4)):
done = False
break
return poly_points
def is_inside(x, y, poly_points):
min_, max_ = min_max(poly_points)
if x < min_.x or y < min_.y or x > max_.x or y > max_.y:
return False
a = PVector(x, min_.y)
b = PVector(x, max_.y)
v_lines = inter_lines(Line(a, b), poly_points)
if not v_lines:
return False
a = PVector(min_.x, y)
b = PVector(max_.x, y)
h_lines = inter_lines(Line(a, b), poly_points)
if not h_lines:
return False
for v in v_lines:
for h in h_lines:
if line_instersect(v, h):
return True
return False
def inter_lines(L, poly_points):
inter_points = []
for p1, p2 in edges(poly_points):
inter = line_instersect(Line(p1, p2), L)
if inter:
inter_points.append(inter)
if not inter_points:
return []
inter_lines = []
if len(inter_points) > 1:
inter_points.sort()
pairs = zip(inter_points[::2], inter_points[1::2])
for p1, p2 in pairs:
if p2:
inter_lines.append(Line(PVector(p1.x, p1.y),
PVector(p2.x, p2.y)))
return inter_lines
class Line():
""" I should change this to a named tuple... """
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
def plot(self):
line(self.p1.x, self.p1.y, self.p2.x, self.p2.y)
def lerp(self, other, t):
p1 = PVector.lerp(self.p1, other.p1, t)
p2 = PVector.lerp(self.p2, other.p2, t)
return Line(p1, p2)
def line_instersect(line_a, line_b):
"""
code adapted from Bernardo Fontes
https://github.com/berinhard/sketches/
"""
x1, y1 = line_a.p1.x, line_a.p1.y
x2, y2 = line_a.p2.x, line_a.p2.y
x3, y3 = line_b.p1.x, line_b.p1.y
x4, y4 = line_b.p2.x, line_b.p2.y
try:
uA = ((x4-x3)*(y1-y3) - (y4-y3)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1));
uB = ((x2-x1)*(y1-y3) - (y2-y1)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1));
except ZeroDivisionError:
return
if not(0 <= uA <= 1 and 0 <= uB <= 1):
return
x = line_a.p1.x + uA * (line_a.p2.x - line_a.p1.x)
y = line_a.p1.y + uA * (line_a.p2.y - line_a.p1.y)
return PVector(x, y)
def edges(poly_points):
return pairwise(poly_points) + [(poly_points[-1], poly_points[0])]
def pairwise(iterable):
import itertools
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
def min_max(points):
points = iter(points)
try:
p = points.next()
min_x, min_y = max_x, max_y = p.x, p.y
except StopIteration:
raise ValueError, "min_max requires at least one point"
for p in points:
if p.x < min_x:
min_x = p.x
elif p.x > max_x:
max_x = p.x
if p.y < min_y:
min_y = p.y
elif p.y > max_y:
max_y = p.y
return (PVector(min_x, min_y),
PVector(max_x, max_y))
def par_hatch(points, divisions, *sides):
vectors = [PVector(p.x, p.y) for p in points]
lines = []
if not sides: sides = [0]
for s in sides:
a, b = vectors[-1 + s], vectors[+0 + s]
d, c = vectors[-2 + s], vectors[-3 + s]
for i in range(1, divisions):
s0 = PVector.lerp(a, b, i/float(divisions))
s1 = PVector.lerp(d, c, i/float(divisions))
lines.append(Line(s0, s1))
return lines

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 26 KiB

Wyświetl plik

@ -0,0 +1,148 @@
# Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day
SKETCH_NAME = "s06a"
OUTPUT = ".pdf"
GRID_SIZE = 30
MARGIN = .1
n = 1 # seed 0 -> n-1
scaleFactor = 8
from line_geometry import Line
from line_geometry import par_hatch
add_library('pdf')
def setup():
global hires, s
size(600, 600)
smooth(8)
randomSeed(1)
init_grid(GRID_SIZE)
s = 1
def draw():
# for s in range(1):
background(100)
hires = createGraphics(
width * scaleFactor,
height * scaleFactor,
PDF, "{}-highres.pdf".format(s))
# beginRecord(hires)
# hires.background(240)
# hires.strokeWeight(.33)
# hires.scale(scaleFactor)
for c in Cell.cells:
c.plot()
# hires.dispose()
# endRecord()
# hires.save("{}-highres".format(s) + OUTPUT)
def keyPressed():
if key == ' ':
init_grid(GRID_SIZE)
if key == 's':
saveFrame("###.png")
if key == 'r':
for c in Cell.cells:
if random(10) < 1:
c.update()
def mousePressed():
for c in Cell.cells:
if dist(c.px, c.py, mouseX, mouseY) < Cell.spacing:
c.update()
def init_grid(grid_size):
Cell.border = width * MARGIN
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
# randomSeed(frameCount+2)
for x in range(-1, grid_size + 1, 2):
for y in range(-1, grid_size + 1, 2):
Node.grid[x, y] = Node(x, y) # extrarir do dict
# Node.grid1[x, y] = Node(x, y) # extrarir do dict
for c in Cell.cells:
c.set_vers()
class Node():
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 random(20) > 10:
# mx, my = width / 2, height / 2
# self.px -= (self.px - mx) * 0.15
# self.py -= (self.py - my) * 0.15
self.x = self.px
self.y = self.py
class Cell():
cells = []
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.can_change = True
def plot(self, t=0):
if dist(self.px, self.py, mouseX, mouseY) < Cell.spacing:
fill(255, 100)
else:
fill(200, 100)
beginShape()
# stroke(255, 0, 0)
for p in self.vers:
vertex(p.x, p.y)
endShape(CLOSE)
def update(self):
Cell.cells.remove(self)
if self.can_change:
self.can_change = False
r = random(100)
y01 = (self.v0.y + self.v1.y) / 2
y23 = (self.v2.y + self.v3.y) / 2
x12 = (self.v1.x + self.v2.x) / 2
x30 = (self.v3.x + self.v0.x) / 2
if r < 33:
self.v0.y = y01 # -1-1
self.v1.y = y01 # -1+1
self.v2.y = y23 # +1-1
self.v3.y = y23 # +1+1
elif r < 66:
self.v0.x = x30 # -1-1
self.v1.x = x12 # -1+1
self.v2.x = x12 # +1-1
self.v3.x = x30 # +1+1
else:
self.v0.y, self.v0.x = y01, x30
self.v1.y, self.v1.x = y01, x12
self.v2.y, self.v2.x = y23, x12
self.v3.y, self.v3.x = y23, x30
# self.v3.x, self.v3.y = self.px, self.py
# mx, my = width / 2, height / 2
# for v in self.vers:
# v.x -= (v.x - mx) * 0.15
# v.y += (v.y - my) * 0.15
# self.v1 = self.v2 = self.v0
def set_vers(self):
self.v0 = Node.grid.get((self.ix - 1, self.iy - 1))
self.v1 = Node.grid.get((self.ix - 1, self.iy + 1))
self.v3 = Node.grid.get((self.ix + 1, self.iy - 1))
self.v2 = Node.grid.get((self.ix + 1, self.iy + 1))
self.vers = [self.v0, self.v1, self.v2, self.v3]