Source code for BiblioPixelAnimations.circle.hyperspace

from bibliopixel.animation.circle import Circle
from bibliopixel.colors import COLORS
from bibliopixel.colors.arithmetic import color_scale
import random


[docs]class Hyperspace(Circle): COLOR_DEFAULTS = ('colors', [COLORS.Green]), def __init__(self, layout, tail=4, growthRate=4, angleDiff=6, **kwds): super().__init__(layout, **kwds) self._tail = tail self._tails = [[] for x in range(360)] self._growthRate = growthRate self._angleDiff = angleDiff
[docs] def pre_run(self): self._step = 0
def _drawTail(self, angle, ring, color): for i in range(self._tail): if ring - i >= 0 and ring - i <= self.lastRing: level = 255 - ((255 // self._tail) * i) self.layout.set(ring - i, angle, color_scale(color, level))
[docs] def step(self, amt=1): self.layout.all_off() for i in range(self._growthRate): newTail = random.randrange(0, 360, self._angleDiff) color = random.choice(self.palette) self._tails[newTail].append((0, color)) for a in range(360): angle = self._tails[a] if len(angle) > 0: removals = [] for r in range(len(angle)): tail = angle[r] if tail[0] <= self.lastRing: self._drawTail(a, tail[0], tail[1]) if tail[0] - (self._tail - 1) <= self.lastRing: tail = (tail[0] + amt, tail[1]) self._tails[a][r] = tail else: removals.append(tail) for r in removals: self._tails[a].remove(r) self._step = 0
[docs]class HyperspaceRainbow(Circle): def __init__(self, layout, tail=4, growthRate=4, angleDiff=6, **kwds): super().__init__(layout, **kwds) self._tail = tail self._tails = [[] for x in range(360)] self._growthRate = growthRate self._angleDiff = angleDiff
[docs] def pre_run(self): self._step = 0
def _drawTail(self, angle, ring, color): for i in range(self._tail): if ring - i >= 0 and ring - i <= self.lastRing: level = 255 - ((255 // self._tail) * i) self.layout.set(ring - i, angle, color_scale(color, level))
[docs] def step(self, amt=1): self.layout.all_off() for i in range(self._growthRate): newTail = random.randrange(0, 360, self._angleDiff) self._tails[newTail].append(0) for a in range(360): angle = self._tails[a] if len(angle) > 0: removals = [] for r in range(len(angle)): tail = angle[r] if tail <= self.lastRing: c = self.palette.get(tail * (255 // self.lastRing)) self._drawTail(a, tail, c) if tail - (self._tail - 1) <= self.lastRing: tail = tail + amt self._tails[a][r] = tail else: removals.append(tail) for r in removals: self._tails[a].remove(r) self._step = 0