kopia lustrzana https://github.com/villares/sketch-a-day
190423
rodzic
ce7febdbc8
commit
f26760537d
|
|
@ -0,0 +1,40 @@
|
|||
"""
|
||||
Alexandre B A Villares http://abav.lugaralgum.com - GPL v3
|
||||
|
||||
A helper for the Processing gifAnimation library https://github.com/extrapixel/gif-animation/tree/3.0
|
||||
Download from https://github.com/villares/processing-play/blob/master/export_GIF/unzip_and_move_to_libraries_GifAnimation.zip
|
||||
This helper was inspired by an example by Art Simon https://github.com/APCSPrinciples/AnimatedGIF/
|
||||
|
||||
# add at the start of your sketch:
|
||||
add_library('gifAnimation')
|
||||
from gif_exporter import gif_export
|
||||
# add at the end of draw():
|
||||
gif_export(GifMaker)
|
||||
"""
|
||||
|
||||
def gif_export(GifMaker, # gets a reference to the library
|
||||
filename="exported", # .gif will be added
|
||||
repeat=0, # 0 makes it an "endless" animation
|
||||
quality=255, # quality range 0 - 255
|
||||
delay=200, # this is quick
|
||||
frames=0, # 0 will stop on keyPressed or frameCount >= 100000
|
||||
finish=False): # force stop
|
||||
global gifExporter
|
||||
try:
|
||||
gifExporter
|
||||
except NameError:
|
||||
gifExporter = GifMaker(this, filename + ".gif")
|
||||
gifExporter.setRepeat(repeat)
|
||||
gifExporter.setQuality(quality)
|
||||
gifExporter.setDelay(delay)
|
||||
|
||||
gifExporter.addFrame()
|
||||
|
||||
if frames == 0:
|
||||
if keyPressed and key == "e":
|
||||
finish = True
|
||||
|
||||
if finish:
|
||||
gifExporter.finish()
|
||||
print("gif saved")
|
||||
exit()
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
|
||||
class Poly():
|
||||
|
||||
text_on = False
|
||||
drag = -1
|
||||
drag_hole = -1
|
||||
drag_drag_pt = -1
|
||||
x_offset = y_offset = 0
|
||||
cell_size = 10
|
||||
|
||||
def __init__(self, outer_pts, holes=[[(0, 0)]]):
|
||||
self.outer_pts = outer_pts
|
||||
self.holes = holes
|
||||
|
||||
def plot(self, x_offset, y_offset):
|
||||
Poly.x_offset, Poly.y_offset = x_offset, y_offset
|
||||
pushStyle()
|
||||
if len(self.outer_pts) >= 3:
|
||||
fill(255)
|
||||
beginShape()
|
||||
for x, y in self.outer_pts:
|
||||
stroke(0)
|
||||
sx = (x + x_offset) * Poly.cell_size
|
||||
sy = (y + y_offset) * Poly.cell_size
|
||||
vertex(sx, sy)
|
||||
for h in self.holes:
|
||||
beginContour()
|
||||
for x, y in h:
|
||||
sx = (x + x_offset) * Poly.cell_size
|
||||
sy = (y + y_offset) * Poly.cell_size
|
||||
vertex(sx, sy)
|
||||
endContour()
|
||||
endShape(CLOSE)
|
||||
Poly.annotate_pts(self.outer_pts, color(200, 0, 0), 5)
|
||||
Poly.annotate_pts(self.holes[0], color(0, 0, 200), 5)
|
||||
popStyle()
|
||||
|
||||
def remove_pt(self, i, j):
|
||||
for pt in self.outer_pts:
|
||||
if (i, j) == pt:
|
||||
self.outer_pts.remove(pt)
|
||||
return True
|
||||
for h in self.holes:
|
||||
for pt in h:
|
||||
if (i, j) == pt:
|
||||
h.remove(pt)
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def annotate_pts(cls, pts, c, scale_m=1):
|
||||
if Poly.text_on:
|
||||
strokeWeight(5)
|
||||
textSize(16)
|
||||
fill(c)
|
||||
stroke(c)
|
||||
for i, j in pts:
|
||||
x = (i + cls.x_offset) * cls.cell_size
|
||||
y = (j + cls.y_offset) * cls.cell_size
|
||||
point(x, y)
|
||||
text(str((i * scale_m, j * scale_m)), x, y)
|
||||
|
||||
@classmethod
|
||||
def grid(cls, order):
|
||||
stroke(128)
|
||||
noFill()
|
||||
for x in range(order):
|
||||
for y in range(order):
|
||||
rect(x * cls.cell_size, y * cls.cell_size,
|
||||
cls.cell_size, cls.cell_size)
|
||||
Plik binarny nie jest wyświetlany.
|
Po Szerokość: | Wysokość: | Rozmiar: 19 KiB |
|
|
@ -0,0 +1,121 @@
|
|||
# Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day
|
||||
"""
|
||||
A minimal poly editor
|
||||
- Drag points from holes
|
||||
- Remove any point with CNTRL + click
|
||||
"""
|
||||
|
||||
from polys import Poly
|
||||
Poly.cell_size = 25
|
||||
Poly.text_on = False
|
||||
|
||||
# add_library('GifAnimation')
|
||||
# from gif_exporter import gif_export
|
||||
|
||||
# f_pts = [map(lambda x: x / 5 - 12, pair) for pair in f_pts]
|
||||
polys = [Poly([(2, 2), (2, 4), (4, 4), (4, 2)]),
|
||||
Poly([(5, 5), (5, 7), (3, 3)]),
|
||||
Poly([(-8, -7), (-1, 0), (1, -9)],
|
||||
holes=[[(-4, -4), (-6, -6), (-1, -7)], ]),
|
||||
]
|
||||
|
||||
def setup():
|
||||
global x_offset, y_offset, order
|
||||
size(500, 500, P2D)
|
||||
order = width / Poly.cell_size
|
||||
x_offset = y_offset = int(order / 2)
|
||||
strokeJoin(ROUND)
|
||||
f = createFont("Fira Mono Bold", 16)
|
||||
textFont(f)
|
||||
|
||||
def draw():
|
||||
background(230)
|
||||
# grade
|
||||
Poly.grid(order)
|
||||
|
||||
for p in polys:
|
||||
p.plot(x_offset, y_offset)
|
||||
|
||||
|
||||
def mousePressed():
|
||||
for i in range(order):
|
||||
x = i * Poly.cell_size
|
||||
for j in range(order):
|
||||
y = j * Poly.cell_size
|
||||
io, jo = i - x_offset, j - y_offset # grid origin correction
|
||||
if dist(mouseX, mouseY, x, y) < Poly.cell_size / 2:
|
||||
if keyPressed and keyCode == CONTROL:
|
||||
for p in polys:
|
||||
if p.remove_pt(io, jo):
|
||||
break
|
||||
else:
|
||||
for ip, p in enumerate(polys):
|
||||
for ipt, pt in enumerate(p.outer_pts):
|
||||
if pt == (io, jo):
|
||||
Poly.drag = ip
|
||||
Poly.drag_pt = ipt
|
||||
break
|
||||
for ih, h in enumerate(p.holes):
|
||||
for ipt, pt in enumerate(h):
|
||||
if pt == (io, jo):
|
||||
Poly.drag = ip
|
||||
Poly.drag_hole = ih
|
||||
Poly.drag_pt = ipt
|
||||
break
|
||||
|
||||
def mouseDragged():
|
||||
if Poly.drag >= 0: # a Poly point has been selected to be dragged
|
||||
if Poly.drag_hole == -1: # if no hole wase selected
|
||||
polys[Poly.drag].outer_pts[Poly.drag_pt] = (
|
||||
int(mouseX / Poly.cell_size) - x_offset,
|
||||
int(mouseY / Poly.cell_size) - y_offset)
|
||||
else:
|
||||
polys[Poly.drag].holes[Poly.drag_hole][Poly.drag_pt] = (
|
||||
int(mouseX / Poly.cell_size) - x_offset,
|
||||
int(mouseY / Poly.cell_size) - y_offset)
|
||||
|
||||
def mouseReleased():
|
||||
Poly.drag = -1 # No poly selected
|
||||
Poly.drag_hole = -1 # No hole selected
|
||||
Poly.drag_pt = -1 # No point selected
|
||||
|
||||
def keyPressed():
|
||||
if key == " ":
|
||||
for p in polys:
|
||||
p.outer_pts[:] = clockwise_sort(p.outer_pts)
|
||||
for h in p.holes:
|
||||
h[:] = clockwise_sort(h)[::-1]
|
||||
# if key == "g":
|
||||
# gif_export(GifMaker, filename=SKETCH_NAME)
|
||||
if key == "s":
|
||||
saveFrame(SKETCH_NAME+"#.png")
|
||||
if key == "t":
|
||||
Poly.text_on = not Poly.text_on
|
||||
|
||||
def clockwise_sort(xy_pairs):
|
||||
# https://stackoverflow.com/questions/51074984/sorting-according-to-clockwise-point-coordinates
|
||||
data_len = len(xy_pairs)
|
||||
if data_len > 2:
|
||||
x, y = zip(*xy_pairs)
|
||||
else:
|
||||
return xy_pairs
|
||||
centroid_x, centroid_y = sum(x) / data_len, sum(y) / data_len
|
||||
xy_sorted = sorted(xy_pairs,
|
||||
key=lambda p: atan2((p[1] - centroid_y), (p[0] - centroid_x)))
|
||||
xy_sorted_xy = [coord for pair in list(zip(*xy_sorted)) for coord in pair]
|
||||
half_len = int(len(xy_sorted_xy) / 2)
|
||||
return list(zip(xy_sorted_xy[:half_len], xy_sorted_xy[half_len:]))
|
||||
|
||||
|
||||
def settings():
|
||||
from os import path
|
||||
global SKETCH_NAME
|
||||
SKETCH_NAME = path.basename(sketchPath())
|
||||
OUTPUT = ".png"
|
||||
println(
|
||||
"""
|
||||

|
||||
|
||||
[{0}](https://github.com/villares/sketch-a-day/tree/master/2019/{0}) [[Py.Processing](https://villares.github.io/como-instalar-o-processing-modo-python/index-EN)]
|
||||
""".format(SKETCH_NAME, OUTPUT)
|
||||
)
|
||||
|
|
@ -23,6 +23,13 @@ Get updates from my sort-of-weekly newsletter: [[sketch-mail](https://villares.o
|
|||
## 2019
|
||||
---
|
||||
|
||||

|
||||
|
||||
[sketch_190423a](https://github.com/villares/sketch-a-day/tree/master/2019/sketch_190423a) [[Py.Processing](https://villares.github.io/como-instalar-o-processing-modo-python/index-EN)]
|
||||
|
||||
Now I drag any point, inclunding of holes, and remove points.
|
||||
TODO: Add points; Drag polys.
|
||||
|
||||
---
|
||||
|
||||

|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue