Skip to content

Commit e61c1ae

Browse files
committed
Dec 31 daily effect
1 parent 1f66efd commit e61c1ae

File tree

3 files changed

+177
-1
lines changed

3 files changed

+177
-1
lines changed

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '0.1.31'
1+
__version__ = '0.1.32'
22

33
_classifiers = [
44
'Development Status :: 4 - Beta',

xled_plus/samples/day31a.py

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"""
2+
Day 31 - Fireworks (version A)
3+
4+
My take on the fireworks theme. Colored blobs growing and sparkling.
5+
This version gives one explosion at a time at controlled intervalls.
6+
Suits best for smaller nonregular installations, eg a christmas tree.
7+
Also check the version in day31b.
8+
"""
9+
10+
from xled_plus.samples.sample_setup import *
11+
12+
13+
class Fireball(Shape):
14+
def __init__(self, cent, minrad, maxrad, speed, huesat):
15+
super(Fireball, self).__init__(cent, 0.0)
16+
self.rad = minrad
17+
self.minrad = minrad
18+
self.maxrad = maxrad
19+
self.speed = speed
20+
self.huesat = huesat
21+
22+
def is_inside(self, coord):
23+
return (
24+
sum(map(lambda x1, x2: (x1 - x2) ** 2, self.cent, coord)) <= self.rad ** 2
25+
)
26+
27+
def get_color(self, coord, ind):
28+
dist2 = (
29+
sum(map(lambda x1, x2: (x1 - x2) ** 2, self.cent, coord)) / self.rad ** 2
30+
)
31+
if dist2 > 1.0:
32+
return False
33+
elif self.rad == self.minrad:
34+
return hsl_color(0.0, 0.0, 1.0)
35+
else:
36+
(hue, sat) = self.huesat
37+
p = (self.rad - self.minrad) / (self.maxrad - self.minrad)
38+
rnd = random()
39+
if rnd < 0.1 * (1.2 - p):
40+
light = 1.0
41+
elif rnd < 0.2 * (1.2 - p):
42+
light = 0.0
43+
else:
44+
light = 2.0 * (1.0 - p) ** 2 - 1.0
45+
return hsl_color(hue, sat, light)
46+
47+
def update(self, step):
48+
self.rad += self.speed * step
49+
50+
51+
class FireworksScene(MovingShapesScene):
52+
def __init__(self, ctr):
53+
super(FireworksScene, self).__init__(ctr)
54+
self.freq = 0.0
55+
self.horizon = 100
56+
self.preferred_frames = 700
57+
self.preferred_fps = 20
58+
self.proj2D3D = "halfsphere"
59+
60+
def create(self):
61+
cent = (0.0, 0.0)
62+
shape = Fireball(cent, 0.10, 1.0, 0.01, (random(), 1.0 - random()**2))
63+
shape.duetime = self.time + 0.9/0.01
64+
return shape
65+
66+
def update(self, step):
67+
for sh in reversed(self.shapes):
68+
if sh.duetime < self.time:
69+
self.shapes.remove(sh)
70+
if self.time >= self.crtime:
71+
if self.record:
72+
sh = self.create()
73+
self.add_shape(copy(sh))
74+
sh.duetime += self.preferred_frames
75+
self.crtime = self.time + 100
76+
self.pre_shapes.append((self.crtime + self.preferred_frames, sh))
77+
elif self.replay:
78+
if self.pre_shapes:
79+
self.add_shape(self.pre_shapes[0][1])
80+
self.crtime = self.pre_shapes[0][0]
81+
self.pre_shapes = self.pre_shapes[1:]
82+
else:
83+
self.add_shape(self.create())
84+
self.crtime = self.time + 100
85+
if self.pre_shapes and self.crtime >= self.pre_shapes[0][0]:
86+
self.replay = True
87+
for sh in self.shapes:
88+
sh.update(step)
89+
self.time += step
90+
91+
if __name__ == '__main__':
92+
ctr = setup_control()
93+
ctr.adjust_layout_aspect(1.0) # How many times wider than high is the led installation?
94+
eff = FireworksScene(ctr)
95+
oldmode = ctr.get_mode()["mode"]
96+
eff.launch_rt()
97+
print("Started continuous effect - press Return to stop it")
98+
input()
99+
eff.stop_rt()
100+
ctr.set_mode(oldmode)

xled_plus/samples/day31b.py

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"""
2+
Day 31 - Fireworks (version B)
3+
4+
My take on the fireworks theme. Colored blobs growing and sparkling.
5+
This version gives explosions at random times and positions.
6+
Suits best for rather large and dense 2D installations.
7+
Also check the version in day31a.
8+
"""
9+
10+
from xled_plus.samples.sample_setup import *
11+
12+
13+
class Fireball(Shape):
14+
def __init__(self, cent, minrad, maxrad, speed, huesat):
15+
super(Fireball, self).__init__(cent, 0.0)
16+
self.rad = minrad
17+
self.minrad = minrad
18+
self.maxrad = maxrad
19+
self.speed = speed
20+
self.huesat = huesat
21+
22+
def is_inside(self, coord):
23+
return (
24+
sum(map(lambda x1, x2: (x1 - x2) ** 2, self.cent, coord)) <= self.rad ** 2
25+
)
26+
27+
def get_color(self, coord, ind):
28+
dist2 = (
29+
sum(map(lambda x1, x2: (x1 - x2) ** 2, self.cent, coord)) / self.rad ** 2
30+
)
31+
if dist2 > 1.0:
32+
return False
33+
elif self.rad == self.minrad:
34+
return hsl_color(0.0, 0.0, 1.0)
35+
else:
36+
(hue, sat) = self.huesat
37+
p = (self.rad - self.minrad) / (self.maxrad - self.minrad)
38+
rnd = random()
39+
if rnd < 0.1 * (1.2 - p):
40+
light = 1.0
41+
elif rnd < 0.2 * (1.2 - p):
42+
light = 0.0
43+
else:
44+
light = 2.0 * (1.0 - p) ** 2 - 1.0
45+
return hsl_color(hue, sat, light)
46+
47+
def update(self, step):
48+
self.rad += self.speed * step
49+
50+
51+
class FireworksScene(MovingShapesScene):
52+
def __init__(self, ctr):
53+
super(FireworksScene, self).__init__(ctr)
54+
self.freq = 0.8
55+
self.horizon = 60
56+
self.preferred_frames = 720
57+
self.preferred_fps = 20
58+
self.proj2D3D = "cylshell"
59+
60+
def create(self):
61+
cent = (random()*1.6 - 0.8, random()*1.6 - 0.8)
62+
shape = Fireball(cent, 0.15, 0.63, 0.008, (random(), 1.0))
63+
shape.duetime = self.time + 0.48/0.008
64+
return shape
65+
66+
67+
if __name__ == '__main__':
68+
ctr = setup_control()
69+
ctr.adjust_layout_aspect(1.0) # How many times wider than high is the led installation?
70+
eff = FireworksScene(ctr)
71+
oldmode = ctr.get_mode()["mode"]
72+
eff.launch_rt()
73+
print("Started continuous effect - press Return to stop it")
74+
input()
75+
eff.stop_rt()
76+
ctr.set_mode(oldmode)

0 commit comments

Comments
 (0)