diff --git a/s086/gif_exporter.py b/s086/gif_exporter.py new file mode 100644 index 00000000..6f54c524 --- /dev/null +++ b/s086/gif_exporter.py @@ -0,0 +1,33 @@ +""" +Alexandre B A Villares http://abav.lugaralgum.com - GPL v3 + +A helper for the Processing gifAnimation library (https://github.com/jordanorelli) +ported to Processing 3 by 01010101 (https://github.com/01010101) +Download the library from https://github.com/01010101/GifAnimation/archive/master.zip +This helper was inspired by an example by Art Simon https://github.com/APCSPrinciples/AnimatedGIF/ + +Put add_library('gifAnimation') at the start of your sketch +and add gif_export(GifMaker) at the end of draw() +""" +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=32, # quality range 0 - 255 + delay=170, # this is quick + frames=0): # 0 will stop on keyPressed or frameCount >= 100000 + 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 and keyPressed or frameCount >= 100000) \ + or (frames != 0 and frameCount >= frames): + gifExporter.finish() + print("gif saved") + exit() diff --git a/s086/s086.gif b/s086/s086.gif new file mode 100644 index 00000000..2721a004 Binary files /dev/null and b/s086/s086.gif differ diff --git a/s086/s086.pyde b/s086/s086.pyde new file mode 100644 index 00000000..0a9baa8d --- /dev/null +++ b/s086/s086.pyde @@ -0,0 +1,63 @@ +# Alexandre B A Villares - https://abav.lugaralgum.com/sketch-a-day +SKETCH_NAME = "s086" # 180327 + +add_library('gifAnimation') +from gif_exporter import gif_export +from slider import Slider +from shapes import * + +A = Slider(1, 40, 10, 'q', 'a') +B = Slider(1, 40, 10, 'w', 's') +C = Slider(1, 40, 10, 'e', 'd') +D = Slider(1, 40, 10, 'r', 'f') + +def setup(): + size(600, 600, P2D) + colorMode(HSB) + rectMode(CENTER) + + A.position(40, height - 70) + B.position(40, height - 30) + C.position(width - 140, height - 70) + D.position(width - 140, height - 30) + +def draw(): + background(200) + noFill() + + a = int(A.val) # number of elements + b = int(B.val) # size of elements + c = int(C.val) # space between elements + d = int(D.val) # number of grids + + randomSeed(int(d * 100)) # a different random seed + + for i in range(d): + tam = a * c + x = int(random(width - tam)/c)*c + y = int(random(height - tam)/c)*c + stroke(rnd_choice(COLORS)) + fill(rnd_choice(COLORS), 100) + strokeWeight(int(random(1, 3))) + grid(x, y, a, b, c, rnd_choice(SHAPES)) + + # # uncomment next lines to export GIF + # if not frameCount % 12: + # gif_export(GifMaker, + # frames=2000, + # delay=340, + # filename=SKETCH_NAME) + + Slider.update_all() + +def grid(x, y, num, size_, space, func): + for i in range(x, x + num * space, space): + for j in range(y, y + num * space, space): + func(i, j, size_, size_) + +def rnd_choice(collection): + i = int(random(len(collection))) + return collection[i] + +# def keyPressed(): +# saveFrame(SKETCH_NAME + '_###.gif') diff --git a/s086/shapes.py b/s086/shapes.py new file mode 100644 index 00000000..30b6dd40 --- /dev/null +++ b/s086/shapes.py @@ -0,0 +1,21 @@ +def exes(x, y, c, _): + with pushMatrix(): + translate(x, y) + line(-c / 2, -c / 2, c / 2, c / 2) + line(c / 2, -c / 2, -c / 2, c / 2) + +def losang(x, y, c, _): + with pushMatrix(): + translate(x, y) + rotate(radians(45)) + rect(0, 0, c, c) + +SHAPES = [ellipse, + rect, + exes, + losang] + +COLORS = [color(0), + color(255), + color(255, 0, 0), + color(0, 0, 255)] diff --git a/s086/slider.py b/s086/slider.py new file mode 100644 index 00000000..4a339543 --- /dev/null +++ b/s086/slider.py @@ -0,0 +1,73 @@ +""" +Slider code based on Peter Farell's htts://twitter.com/hackingmath +https://github.com/hackingmath/python-sliders http://farrellpolymath.com/ +""" + +class Slider: + + SLIDERS = [] + + def __init__(self, low, high, default, more_key, less_key): + '''slider has range from low to high + and is set to default''' + self.low = low + self.high = high + self.val = default + self.clicked = False + self.more = more_key + self.less = less_key + Slider.SLIDERS.append(self) + + def position(self, x, y): + '''slider's position on screen''' + self.x = x + self.y = y + # the position of the rect you slide: + self.rectx = self.x + map(self.val, self.low, self.high, 0, 120) + self.recty = self.y - 10 + + def update(self): + '''updates the slider''' + pushStyle() + rectMode(CENTER) + # black translucid rect behind slider + fill(0, 100) + noStroke() + rect(self.x + 60, self.y, 130, 20) + # gray line behind slider + strokeWeight(4) + stroke(200) + line(self.x, self.y, self.x + 120, self.y) + # press mouse to move slider + if (self.x < mouseX < self.x + 120 and + self.y < mouseY < self.y + 20): + fill(250) + textSize(10) + text(str(self.val), self.rectx, self.recty + 35) + if mousePressed: + self.rectx = mouseX + # key usage + if keyPressed: + if key == self.more: + self.rectx += 1 + if key == self.less: + self.rectx -= 1 + # constrain rectangle + self.rectx = constrain(self.rectx, self.x, self.x + 120) + # draw rectangle + strokeWeight(1) + fill(255) + rect(self.rectx, self.recty + 10, 10, 20) + self.val = map(self.rectx, self.x, self.x + 120, self.low, self.high) + popStyle() + + def value(self): + ''' backwards compatible method... ''' + self.update() + return self.val + + @classmethod + def update_all(cls): + for slider in Slider.SLIDERS: + slider.update() +