From 5f093baa9340da7cb1aa4059e0070917e0df988a Mon Sep 17 00:00:00 2001 From: Alex Silcock Date: Wed, 5 Oct 2022 22:56:56 +0100 Subject: [PATCH] Improve sinewave pattern efficiency --- patterns/sinewave.py | 52 +++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/patterns/sinewave.py b/patterns/sinewave.py index 2c0f616..2f5f1f8 100644 --- a/patterns/sinewave.py +++ b/patterns/sinewave.py @@ -1,50 +1,48 @@ import cubehelper -import random import math -def rainbow(iter,step): - def compo(pattArray,angle): - for num in pattArray["high"]: - if (angle >= num[0]) and (angle <= num[1]): - comp = 1.0 - - for num in pattArray["low"]: - if (angle >= num[0]) and (angle <= num[1]): - comp = 0.0 +def compo(pattArray,angle): + for num in pattArray["high"]: + if (angle >= num[0]) and (angle <= num[1]): + comp = 1.0 - for num in pattArray["up"]: - if (angle >= num[0]) and (angle <= num[1]): - comp = (angle - num[0])/(num[1]-num[0]+0.0) + for num in pattArray["low"]: + if (angle >= num[0]) and (angle <= num[1]): + comp = 0.0 - for num in pattArray["down"]: - if (angle >= num[0]) and (angle <= num[1]): - comp = (num[1] - angle)/(num[1]-num[0]+0.0) + for num in pattArray["up"]: + if (angle >= num[0]) and (angle <= num[1]): + comp = (angle - num[0])/(num[1]-num[0]+0.0) - return comp + for num in pattArray["down"]: + if (angle >= num[0]) and (angle <= num[1]): + comp = (num[1] - angle)/(num[1]-num[0]+0.0) - angle = (iter*step)%360 + return comp - b = { +b = { "high": [[180, 299]], "low": [[0, 119]], "up": [[120, 179]], "down": [[300, 359]] - } +} - r = { +r = { "high": [[300, 359], [0, 59]], "low": [[120, 239]], "up": [[240, 299]], "down": [[60, 119]] - } +} - g = { +g = { "high": [[60, 179]], "low": [[240, 359]], "up": [[0, 59]], "down": [[180, 239]] - } +} +def rainbow(iter,step): + angle = (iter*step)%360 return (compo(r,angle), compo(g,angle), compo(b,angle)) class Pattern(object): @@ -54,18 +52,18 @@ def init(self): self.sinwidth = 0.3 self.color = cubehelper.random_color() self.prevColor = cubehelper.random_color() + self.double_buffer = True return 1.0/15 def tick(self): self.cube.clear() - color = cubehelper.mix_color(self.prevColor, self.color, (math.sin(self.sinwidth*self.iter) + 1 )/2) - ran = random.randrange(100) for x in range(0, self.cube.size): + color = rainbow(self.iter+x, 10) for y in range(0, self.cube.size): z = math.floor(math.sin(self.sinwidth*(self.iter+(x+y)))*3.2+4) - self.cube.set_pixel((x, y, int(z)), rainbow(self.iter+x, 10)) + self.cube.set_pixel((x, y, int(z)), color) self.iter += self.delta if (math.sin(self.sinwidth*self.iter)+1)/2 < 0.1: