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 | ## 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
	
	 villares
						villares