|  | @ -28,22 +28,22 @@ def half_circle(x, y, radius, quadrant): | |||
| 
 | ||||
| def circle_arc(x, y, radius, start_ang, sweep_ang): | ||||
|     arc(x, y, radius * 2, radius * 2, start_ang, start_ang + sweep_ang) | ||||
|      | ||||
| 
 | ||||
| def poly_arc(x, y, radius, start_ang, sweep_ang, num_points=2): | ||||
|     angle = sweep_ang / int(num_points) | ||||
|     a = start_ang | ||||
|     with beginShape():  | ||||
|     with beginShape(): | ||||
|         while a <= start_ang + sweep_ang: | ||||
|             sx = x + cos(a) * radius | ||||
|             sy = y + sin(a) * radius | ||||
|             vertex(sx, sy) | ||||
|             a += angle | ||||
|              | ||||
| 
 | ||||
| def arc_poly(x, y, d, _, start_ang, end_ang, num_points=5): | ||||
|     sweep_ang = end_ang - start_ang | ||||
|     angle = sweep_ang / int(num_points) | ||||
|     a = start_ang | ||||
|     with beginShape():  | ||||
|     with beginShape(): | ||||
|         while a <= end_ang: | ||||
|             sx = x + cos(a) * d / 2 | ||||
|             sy = y + sin(a) * d / 2 | ||||
|  | @ -102,5 +102,5 @@ def var_bar(p1x, p1y, p2x, p2y, r1, r2=None): | |||
|             arc(d, 0, r2 * 2, r2 * 2, | ||||
|                 beta - PI, PI - beta) | ||||
|     else: | ||||
|             ellipse(x1, y1, r1*2, r1*2) | ||||
|             ellipse(x2, y2, r2*2, r2*2) | ||||
|         ellipse(p1x, p1y, r1 * 2, r1 * 2) | ||||
|         ellipse(p2y, p2x, r2 * 2, r2 * 2) | ||||
|  |  | |||
| Po Szerokość: | Wysokość: | Rozmiar: 1.6 MiB | 
|  | @ -32,9 +32,9 @@ def setup(): | |||
| def keyPressed(): | ||||
|     global save_frames | ||||
|     if key == 's': | ||||
|         saveFrame("####.png") | ||||
|         # save_frames = not save_frames | ||||
|         # print "Saving "+repr(save_frames) | ||||
|         # saveFrame("####.png") | ||||
|         save_frames = not save_frames | ||||
|         print "Saving "+repr(save_frames) | ||||
|     if key == 'r': | ||||
|         make_nodes_point(desenho_atual) | ||||
|     if key == 'n': | ||||
|  | @ -90,6 +90,7 @@ def draw(): | |||
|         desenho = desenho_atual | ||||
|         if not mousePressed: | ||||
|             make_nodes_point(outro_desenho) | ||||
|             print("will reset") | ||||
|         else: | ||||
|             outro_desenho[:] = cp.deepcopy(desenho_inicial) | ||||
|      | ||||
|  | @ -117,7 +118,7 @@ def draw(): | |||
|             var_bar(node.x, node.y, other.x, other.y, | ||||
|                     node.t_size, node.s_weight * 5) | ||||
|              | ||||
|     if save_frames and fc % 2: | ||||
|     if save_frames and frameCount % 10 == 0: | ||||
|         saveFrame("####.tga") | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
| Po Szerokość: | Wysokość: | Rozmiar: 56 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 69 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 64 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 59 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 64 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 68 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 70 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 57 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 68 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 66 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 64 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 61 KiB | 
| Po Szerokość: | Wysokość: | Rozmiar: 57 KiB | 
|  | @ -0,0 +1,106 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| ROTATION = {0: 0, | ||||
|             BOTTOM: 0, | ||||
|             DOWN: 0, | ||||
|             1: HALF_PI, | ||||
|             LEFT: HALF_PI, | ||||
|             2: PI, | ||||
|             TOP: PI, | ||||
|             UP: PI, | ||||
|             3: PI + HALF_PI, | ||||
|             RIGHT: PI + HALF_PI, | ||||
|             BOTTOM + RIGHT: 0, | ||||
|             DOWN + RIGHT: 0, | ||||
|             DOWN + LEFT: HALF_PI, | ||||
|             BOTTOM + LEFT: HALF_PI, | ||||
|             TOP + LEFT: PI, | ||||
|             UP + LEFT: PI, | ||||
|             TOP + RIGHT: PI + HALF_PI, | ||||
|             UP + RIGHT: PI + HALF_PI, | ||||
|             } | ||||
| 
 | ||||
| def quarter_circle(x, y, radius, quadrant): | ||||
|     circle_arc(x, y, radius, ROTATION[quadrant], HALF_PI) | ||||
| 
 | ||||
| def half_circle(x, y, radius, quadrant): | ||||
|     circle_arc(x, y, radius, ROTATION[quadrant], PI) | ||||
| 
 | ||||
| def circle_arc(x, y, radius, start_ang, sweep_ang): | ||||
|     arc(x, y, radius * 2, radius * 2, start_ang, start_ang + sweep_ang) | ||||
| 
 | ||||
| def poly_arc(x, y, radius, start_ang, sweep_ang, num_points=2): | ||||
|     angle = sweep_ang / int(num_points) | ||||
|     a = start_ang | ||||
|     with beginShape(): | ||||
|         while a <= start_ang + sweep_ang: | ||||
|             sx = x + cos(a) * radius | ||||
|             sy = y + sin(a) * radius | ||||
|             vertex(sx, sy) | ||||
|             a += angle | ||||
| 
 | ||||
| def arc_poly(x, y, d, _, start_ang, end_ang, num_points=5): | ||||
|     sweep_ang = end_ang - start_ang | ||||
|     angle = sweep_ang / int(num_points) | ||||
|     a = start_ang | ||||
|     with beginShape(): | ||||
|         while a <= end_ang: | ||||
|             sx = x + cos(a) * d / 2 | ||||
|             sy = y + sin(a) * d / 2 | ||||
|             vertex(sx, sy) | ||||
|             a += angle | ||||
| 
 | ||||
| def bar(x1, y1, x2, y2, thickness=None, shorter=0, ends=(1, 1)): | ||||
|     """ | ||||
|     O código para fazer as barras, dois pares (x, y), | ||||
|     um parâmetro de encurtamento: shorter | ||||
|     """ | ||||
|     L = dist(x1, y1, x2, y2) | ||||
|     if not thickness: | ||||
|         thickness = 10 | ||||
|     with pushMatrix(): | ||||
|         translate(x1, y1) | ||||
|         angle = atan2(x1 - x2, y2 - y1) | ||||
|         rotate(angle) | ||||
|         offset = shorter / 2 | ||||
|         line(thickness / 2, offset, thickness / 2, L - offset) | ||||
|         line(-thickness / 2, offset, -thickness / 2, L - offset) | ||||
|         if ends[0]: | ||||
|             half_circle(0, offset, thickness / 2, UP) | ||||
|         if ends[1]: | ||||
|             half_circle(0, L - offset, thickness / 2, DOWN) | ||||
| 
 | ||||
| def var_bar(p1x, p1y, p2x, p2y, r1, r2=None): | ||||
|     if r2 is None: | ||||
|         r2 = r1 | ||||
|     d = dist(p1x, p1y, p2x, p2y) | ||||
|     if d > 0: | ||||
|         with pushMatrix(): | ||||
|             translate(p1x, p1y) | ||||
|             angle = atan2(p1x - p2x, p2y - p1y) | ||||
|             rotate(angle + HALF_PI) | ||||
|             ri = r1 - r2 | ||||
|             beta = asin(ri / d) + HALF_PI | ||||
|             x1 = cos(beta) * r1 | ||||
|             y1 = sin(beta) * r1 | ||||
|             x2 = cos(beta) * r2 | ||||
|             y2 = sin(beta) * r2 | ||||
|             # with pushStyle(): | ||||
|             # noStroke() | ||||
|             # beginShape() | ||||
|             # vertex(-x1, -y1) | ||||
|             # vertex(d - x2, -y2) | ||||
|             # vertex(d, 0) | ||||
|             #      #vertex(d - x2, +y2, 0) | ||||
|             #      #vertex(-x1, +y1, 0) | ||||
|             #      #vertex(0, 0, 0) | ||||
|             # endShape() | ||||
|             line(-x1, -y1, d - x2, -y2) | ||||
|             line(-x1, +y1, d - x2, +y2) | ||||
|             arc(0, 0, r1 * 2, r1 * 2, | ||||
|                 -beta - PI, beta - PI) | ||||
|             arc(d, 0, r2 * 2, r2 * 2, | ||||
|                 beta - PI, PI - beta) | ||||
|     else: | ||||
|         ellipse(p1x, p1y, r1 * 2, r1 * 2) | ||||
|         ellipse(p2y, p2x, r2 * 2, r2 * 2) | ||||
|  | @ -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,164 @@ | |||
| # Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day | ||||
| SKETCH_NAME, OUTPUT = "sketch_190204a", ".gif"  | ||||
| 
 | ||||
| """ | ||||
| A retake of sketch 58 180228 + work from 190201 :) | ||||
| """ | ||||
| 
 | ||||
| add_library('GifAnimation') | ||||
| add_library('peasycam') | ||||
| from arcs import var_bar | ||||
| from collections import namedtuple | ||||
| import random as rnd | ||||
| import copy as cp | ||||
| 
 | ||||
| SPACING, MARGIN = 120, 0 | ||||
| X_LIST, Y_LIST = [], []  # listas de posições para elementos | ||||
| desenho_atual, outro_desenho, desenho_inter, desenho_inicial = [], [], [], [] | ||||
| NUM_NODES = 32  # número de elementos do desenho / number of nodes | ||||
| Node = namedtuple( | ||||
|     'Node', 'x y t_size s_weight is_special points_to') | ||||
| save_frames = False | ||||
| 
 | ||||
| def setup(): | ||||
|     smooth(16) | ||||
|     size(600, 600, P3D) | ||||
|     rectMode(CENTER) | ||||
|     noFill() | ||||
|     cam = PeasyCam(this, 500) | ||||
|     X_LIST[:] = [x for x in range(MARGIN, 1 + width - MARGIN, SPACING)] | ||||
|     Y_LIST[:] = [y for y in range(MARGIN, 1 + height - MARGIN, SPACING)] | ||||
|     novo_desenho(desenho_atual) | ||||
|     desenho_inicial[:] = cp.deepcopy(desenho_atual) | ||||
|     println("'s' to save, and 'n' for a new drawing") | ||||
| 
 | ||||
| def keyPressed(): | ||||
|     global save_frames | ||||
|     if key == 's': | ||||
|         saveFrame("####.png") | ||||
|         # save_frames = not save_frames | ||||
|         # print "Saving "+repr(save_frames) | ||||
|     if key == 'r': | ||||
|         make_nodes_point(desenho_atual) | ||||
|     if key == 'n': | ||||
|         novo_desenho(desenho_atual) | ||||
|     if key == ' ': | ||||
|         background(200) | ||||
| 
 | ||||
| def novo_desenho(desenho): | ||||
|     """ | ||||
|     esvazia a lista elementos (setas e linhas) do desenho anterior | ||||
|     clears the list of nodes and creates a a new drawing appending desenho_atual, | ||||
|     a list of nodes/drawing elements: specials, connecting lines and lonely nodes | ||||
|     """ | ||||
|     desenho[:] = [] | ||||
|     for _ in range(NUM_NODES): | ||||
|         desenho.append(new_node()) | ||||
|     make_nodes_point(desenho) | ||||
|     outro_desenho[:] = cp.deepcopy(desenho) | ||||
|     make_nodes_point(outro_desenho) | ||||
| 
 | ||||
| 
 | ||||
| def new_node(): | ||||
|     return Node(                   # elemento/"nó" uma namedtuple com: | ||||
|         rnd.choice(X_LIST),        # x | ||||
|         rnd.choice(Y_LIST),        # y | ||||
|         rnd.choice([10, 20, 30]),  # t_size (tail/circle size) | ||||
|         rnd.choice([2, 4, 6]),     # s_weight | ||||
|         True, #rnd.choice([True, False]),  # is_special? (se é seta ou 'linha') | ||||
|         []  # points_to... (lista com ref. a outro elem.)) | ||||
|     ) | ||||
| 
 | ||||
| def make_nodes_point(desenho): | ||||
|     for node in desenho:  # para cada elemento do desenho | ||||
|         node.points_to[:] = [] | ||||
|         random_node = rnd.choice(desenho)  # sorteia o,utro elemento | ||||
|         if ((node.x, node.y) != (random_node.x, random_node.y) | ||||
|             and dist(node.x, node.y, random_node.x, random_node.y) <= SPACING * 3): | ||||
|             # 'aponta' para este elemento, acrescenta na sub_lista | ||||
|             node.points_to.append(random_node) | ||||
|         else: | ||||
|             node.points_to.append(node) | ||||
| 
 | ||||
| def draw(): | ||||
|     translate(-width/2, -height/2) | ||||
|     global desenho_atual, outro_desenho | ||||
|     background(200) | ||||
|     fc = frameCount % 300 - 150 | ||||
|     if fc < 0: | ||||
|         desenho = desenho_atual | ||||
|     elif 0 <= fc < 149: | ||||
|         if frameCount % 10 == 0: | ||||
|             make_inter_nodes(map(fc, 0, 150, 0, 1)) | ||||
|         desenho = desenho_inter | ||||
|     elif fc == 149: | ||||
|         desenho_atual, outro_desenho = outro_desenho, desenho_atual | ||||
|         desenho = desenho_atual | ||||
|         if not mousePressed: | ||||
|             make_nodes_point(outro_desenho) | ||||
|             print("will reset") | ||||
|         else: | ||||
|             outro_desenho[:] = cp.deepcopy(desenho_inicial) | ||||
|      | ||||
|     # draws white 'lines', non-specials, first. | ||||
|     for node in (n for n in desenho if not n.is_special): | ||||
|         for other in node.points_to:  # se estiver apontando para alguém | ||||
|             #strokeWeight(node.s_weight) | ||||
|             stroke(255) | ||||
|             line(node.x, node.y, other.x, other.y) | ||||
|             # desenha o círculo (repare que só em nós que 'apontam') | ||||
|             ellipse(node.x, node.y, node.t_size, node.t_size) | ||||
|     # then draws 'lonely nodes' in red (nodes that do not point anywhere) | ||||
|     for node in (n for n in desenho if not n.points_to): | ||||
|         #strokeWeight(node.s_weight) | ||||
|         stroke(100)  # grey stroke for lonely nodes | ||||
|         if node.is_special: | ||||
|             ellipse(node.x, node.y, node.t_size*2, node.t_size*2) | ||||
|         else: | ||||
|             ellipse(node.x, node.y, node.t_size, node.t_size) | ||||
|     # then draws black specials | ||||
|     for node in (n for n in desenho if n.is_special): | ||||
|         for other in node.points_to:  # se estiver apontando para alguém | ||||
|             #strokeWeight(node.s_weight) | ||||
|             stroke(0) | ||||
|             #fill(255, 100) | ||||
|             with pushMatrix(): | ||||
|                 for i in range(-5, 10, 2): | ||||
|                     translate(0, 0, node.s_weight) | ||||
|                     var_bar(node.x, node.y, other.x, other.y, | ||||
|                     node.t_size-i, node.s_weight * 5-i) | ||||
|              | ||||
|     if save_frames and frameCount % 10 == 0: | ||||
|         saveFrame("####.tga") | ||||
| 
 | ||||
| 
 | ||||
| def make_inter_nodes(amt): | ||||
|     desenho_inter[:] = [] | ||||
|     for n1, n2 in zip(desenho_atual, outro_desenho): | ||||
|         if n1.points_to: | ||||
|             p1x, p1y = n1.points_to[0].x, n1.points_to[0].y | ||||
|         else: | ||||
|             p1x, p1y = n1.x, n1.y | ||||
|         if n2.points_to: | ||||
|             p2x, p2y = n2.points_to[0].x, n2.points_to[0].y | ||||
|         else: | ||||
|             p2x, p2y = n2.x, n2.y | ||||
|         desenho_inter.append(Node(                   # elemento/"nó" uma namedtuple com: | ||||
|             n1.x,        # x | ||||
|             n1.y,        # y | ||||
|             n1.t_size,  # t_size (tail/circle size) | ||||
|             n1.s_weight,     # s_weight (espessura da linha) | ||||
|             n1.is_special,  # is_special? (se é barra ou 'linha') | ||||
|             # cp.deepcopy(n1.points_to) | ||||
|             [PVector(lerp(p1x, p2x, amt), lerp(p1y, p2y, amt))] | ||||
|         )) | ||||
| 
 | ||||
| # print text to add to the project's README.md | ||||
| def settings(): | ||||
|     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) | ||||
|     ) | ||||
 Alexandre B A Villares
						Alexandre B A Villares