Add 5-coloring shows by John Sullivan and start on Henry Segerman's

This commit is contained in:
Glen Whitney 2019-09-27 16:54:15 -04:00
parent 10076aa667
commit 8817603fb1
4 changed files with 103 additions and 7 deletions

3
.gitignore vendored
View File

@ -1,4 +1,7 @@
# ---> Python # ---> Python
# emacs
*~
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]

View File

@ -3,3 +3,5 @@
code to drive a light show on the edges of a small stellated dodecahedron, each with a Phillips Hue lightstrip embedded in it. code to drive a light show on the edges of a small stellated dodecahedron, each with a Phillips Hue lightstrip embedded in it.
This project depends on the phue package (https://github.com/studioimaginaire/phue) which you should be able to install via `sudo pip3 install phue`. This project depends on the phue package (https://github.com/studioimaginaire/phue) which you should be able to install via `sudo pip3 install phue`.
Copyright 2019 by Glen Whitney with contributions by others as noted in the code.

View File

@ -43,7 +43,25 @@ edgecode[29] = 'XX';
edges = [ b[code] for code in edgecode ] edges = [ b[code] for code in edgecode ]
def hueint(frac): return int(frac*65535) lasthue = 65535
fullbright = 254
fullsat = 254
# some color preliminaries
white = {'hue' : 0, 'bri' : fullbright, 'sat' : 0}
black = {'bri' : 0, 'sat' : 0}
def hueint(frac): return int((frac % 1)*lasthue)
def fshue(frac):
'''Returns a hue number based on the fractional part of frac, warping
[0,1/2) to [0,1/6) and [1/2,1) to [1/2,2/3]
'''
frac = frac % 1
if frac < 0.5: return hueint(frac/3);
else: return hueint((frac+1)/3);
def vivid(hue): return {'hue' : hue, 'bri' : fullbright, 'sat' : fullsat}
# A "setting" is a pair of a list of N lists of edges, and a list of N dicts # A "setting" is a pair of a list of N lists of edges, and a list of N dicts
# understandable by Bridge.set_light, # understandable by Bridge.set_light,
@ -53,10 +71,10 @@ def hueint(frac): return int(frac*65535)
# in any list will be left alone. # in any list will be left alone.
alltogether = [range(0,Nedges)]; alltogether = [range(0,Nedges)];
thevoid = (alltogether, ['bri' : 0]) thevoid = (alltogether, [black])
deepblue = (alltogether, [{'hue' : hueint(2/3), 'bri' : 254, 'sat' : 254}]) deepblue = (alltogether, [vivid(hueint(2/3))])
yelorng = (alltogether, [{'hue' : hueint(1/6), 'bri' : 254, 'sat' : 254}]) yelorng = (alltogether, [vivid(hueint(1/6))])
redred = (alltogether, [{'hue' : 0, 'bri' : 254, 'sat' : 254}]) redred = (alltogether, [vivid(hueint(0))])
# A "simpleshow" is a pair of a list of settings, and a list of triples of # A "simpleshow" is a pair of a list of settings, and a list of triples of
# integers: (setting_index, transition_to, hold_time) # integers: (setting_index, transition_to, hold_time)
@ -68,8 +86,9 @@ redred = (alltogether, [{'hue' : 0, 'bri' : 254, 'sat' : 254}])
intro = ([thevoid, deepblue, yelorng, redred], intro = ([thevoid, deepblue, yelorng, redred],
[(0,1,0), (1,30,20), [(0,1,0), (1,30,20),
(2,1,3), (1,1,3), (2,1,3), (1,1,3), (2,1,3), (1,1,3), (2,1,0), (2,1,3), (1,1,3), (2,1,3), (1,1,3), (2,1,3), (1,1,3), (2,1,0),
(3,50,20), (0,30,5)] (3,50,20), (0,30,5)])
)
interlude = ([thevoid], [(0,30,10)])
def runsimple(ss): def runsimple(ss):
'''Takes one argument, a simple show; causes the simple show to be '''Takes one argument, a simple show; causes the simple show to be
@ -88,3 +107,37 @@ def runsimple(ss):
time.sleep(hold_time/10) time.sleep(hold_time/10)
runsimple(intro) runsimple(intro)
# Tour of 5-colorings by Henry Segerman
basehues = {'Red': 0, 'Orange': 5461, 'Yellow': 10923, 'Cyan': 32768,
'Blue': 43691}
fivehues = [basehues[c] for c in ['Red', 'Orange', 'Yellow', 'Cyan', 'Blue']]
fivecolors = [vivid(h) for h in fivehues]
fivecs = [];
fivecs.append([[0,22,9,12,25,17], [27,20,10,7,1,15], [26,11,21,8,3,16],
[29,23,13,18,5,2], [28,24,4,6,14,19]]);
#fivecs.append(([[0,22,9,12,25,17], [27,20,15,24,6,4], [26,11,21,8,3,16],
# [29,23,13,18,5,2], [28,14,19,10,1,7]], fivecolors));
#fivecs.append(([[12,25,17,8,3,21], [27,20,15,24,6,4], [26,11,16,0,9,22],
# [29,23,13,18,5,2], [28,14,19,10,1,7]], fivecolors));
#fivecs.append(([[12,17,8,3,28,10], [27,20,15,24,6,4], [26,11,16,0,9,22],
# [29,23,13,18,5,2], [14,19,1,7,25,21]], fivecolors));
#fivecs.append(([[12,17,8,3,28,10], [27,20,24,4,16,9], [26,11,0,22, ,15,6],[29,23,13,18,5,2],[14,19, 1,7, 25,21]]
#
#"5"
#[[17, 3, 28, 0,6,11],[27,20, 24,4, 16,9],[26, 22, 15, 8,12,10 ],[29,23,13,18,5,#2],[14,19, 1,7, 25,21]]
#
#"6"
#[[17, 3, 28, 0,6,11],[27, 24, 16, 7,19,21],[26, 22, 15, 8,12,10 ],[29,23,13,18,5,2],[14, 1, 25, 4,9,20]]
exec(open("fivecolor.py").read())
runsimple(interlude)
runsimple(jmsshow1)
runsimple(interlude)
runsimple(jmsshow2)

38
fivecolor.py Normal file
View File

@ -0,0 +1,38 @@
### firestar show based on the most symmetric five-coloring
### by John M. Sullivan
def somecolors(x, n=5, wh=False):
colors = []
for i in range(0,4):
if i < n:
colors.append(vivid(fshue(x+i/5)))
elif i == n and wh:
colors.append(white)
else:
colors.append(black)
return colors
jmscolorings1 = [
somecolors(0,0), somecolors(0,0,True),
somecolors(0,1), somecolors(0,1,True),
somecolors(0,2), somecolors(0,2,True),
somecolors(0,3), somecolors(0,3,True),
somecolors(0,4), somecolors(0,4,True),
somecolors(0)
]
jmssettings1 = [(fivecs[0], col) for col in jmscolorings1]
jmsshow1 = (jmssettings1,
[(0,1,2),
(1,1,2),(0,1,2),(1,1,2),(2,1,30),
(3,1,2),(2,1,2),(3,1,2),(4,1,30),
(5,1,2),(4,1,2),(5,1,2),(6,1,30),
(7,1,2),(6,1,2),(7,1,2),(8,1,30),
(9,1,2),(8,1,2),(9,1,2),(10,1,90)])
jmscolorings2 = [somecolors(x/120) for x in range(0,119)]
jmssettings2 = [(fivecs[0], col) for col in jmscolorings2]
jmstimings2 = [(n,2,0) for n in range(0,119)]
jmsshow2 = (jmssettings2, jmstimings2)