FrontPage
»
ProgrammingForArtists
»
ContagiousScriptsLibrary
»
SynergyPy
from visual import *
from math import sqrt
# Yes, I know this code is crufty. I was making this up as I went along and it
# needs a huge refactoring. Don't use it for anything mission-critical %-)
colorTable = []
fixedrange = range(100)
class ColorCycler:
def __init__(self, startindex=0, colorTable=colorTable):
self.index = startindex
self.colorTable = colorTable
self.buildColorTable()
def buildColorTable(self):
if self.colorTable:
self.maxIndex = len(self.colorTable)
return
red = 1.0
green = 0.0
blue = 0.0
for i in fixedrange:
self.colorTable.append((red,green,blue))
green = green + 0.01
for i in fixedrange:
self.colorTable.append((red,green,blue))
red = red - 0.01
for i in fixedrange:
self.colorTable.append((red,green,blue))
blue = blue + 0.01
for i in fixedrange:
self.colorTable.append((red,green,blue))
green = green - 0.01
for i in fixedrange:
self.colorTable.append((red,green,blue))
red = red + 0.01
for i in fixedrange:
self.colorTable.append((red,green,blue))
blue = blue - 0.01
self.maxIndex = len(self.colorTable)
def nextColor(self):
self.index = self.index + 1
if self.index >= self.maxIndex: self.index = 0
#print self.colorTable[self.index]
return self.colorTable[self.index]
ca = ColorCycler()
nexta = ca.nextColor
cb = ColorCycler(startindex=200)
nextb = cb.nextColor
cc = ColorCycler(startindex=400)
nextc = cc.nextColor
scene = display(title="Synergy", width=150, height=150)
numIcoFace = range(20)
numIcoVert = range(12)
numTetraFace = range(4)
numTetraVert = range(4)
numCubeFace = range(6)
numCubeVert = range(8)
tetravert1 = ((1,1,1),(1,-1,-1),(-1,-1,1),(-1,1,-1))
tetravert2 = ((-1,-1,-1),(-1,1,1),(1,1,-1),(1,-1,1))
tetravert3 = ((-0.5,-0.5,-0.5),(-0.5,0.5,0.5),(0.5,0.5,-0.5),(0.5,-0.5,0.5))
tetraface1 = ((tetravert1[1],tetravert1[2],tetravert1[3]),
(tetravert1[0],tetravert1[3],tetravert1[2]),
(tetravert1[0],tetravert1[1],tetravert1[3]),
(tetravert1[0],tetravert1[2],tetravert1[1]))
tetraface2 = ((tetravert2[1],tetravert2[2],tetravert2[3]),
(tetravert2[0],tetravert2[3],tetravert2[2]),
(tetravert2[0],tetravert2[1],tetravert2[3]),
(tetravert2[0],tetravert2[2],tetravert2[1]))
tetraface3 = ((tetravert3[1],tetravert3[2],tetravert3[3]),
(tetravert3[0],tetravert3[3],tetravert3[2]),
(tetravert3[0],tetravert3[1],tetravert3[3]),
(tetravert3[0],tetravert3[2],tetravert3[1]))
cubevert = ((1,1,1),(-1,1,1),(-1,-1,1),(1,-1,1),(1,1,-1),(-1,1,-1),(-1,-1,-1),(1,-1,-1))
cubeface = ((cubevert[4],cubevert[7],cubevert[6],cubevert[5]),
(cubevert[0],cubevert[1],cubevert[2],cubevert[3]),
(cubevert[3],cubevert[2],cubevert[6],cubevert[7]),
(cubevert[4],cubevert[5],cubevert[1],cubevert[0]),
(cubevert[0],cubevert[3],cubevert[7],cubevert[4]),
(cubevert[6],cubevert[7],cubevert[3],cubevert[2]))
tau = (sqrt(5) - 1.0)/2.0
icovert = ((0,1,tau),(0,1,-tau),(1,tau,0),(1,-tau,0),(0,-1,-tau),(0,-1,tau),
(tau,0,1),(-tau,0,1),(tau,0,-1),(-tau,0,-1),(-1,tau,0),(-1,-tau,0))
icoface = ((icovert[0],icovert[6],icovert[2]),
(icovert[2],icovert[6],icovert[3]),
(icovert[3],icovert[6],icovert[5]),
(icovert[5],icovert[6],icovert[7]),
(icovert[0],icovert[7],icovert[6]),
(icovert[2],icovert[3],icovert[8]),
(icovert[2],icovert[8],icovert[1]),
(icovert[0],icovert[2],icovert[1]),
(icovert[0],icovert[1],icovert[10]),
(icovert[10],icovert[1],icovert[9]),
(icovert[1],icovert[8],icovert[9]),
(icovert[3],icovert[4],icovert[8]),
(icovert[4],icovert[3],icovert[5]),
(icovert[4],icovert[5],icovert[11]),
(icovert[7],icovert[10],icovert[11]),
(icovert[7],icovert[0],icovert[10]),
(icovert[4],icovert[11],icovert[9]),
(icovert[8],icovert[4],icovert[9]),
(icovert[5],icovert[7],icovert[11]),
(icovert[11],icovert[10],icovert[9]))
scene.autoscale = 0
angle = math.pi / 180
delay = 50
origin = (0,0,0)
axis = (0,1,0)
class Hedron:
def _rotate(self, origin=origin):
colora = nexta()
colorb = nextb()
colorc = nextc()
for v in self.visvert:
v.color = colora
for e in self.visedge:
e.color = colorb
for f in self.visface:
f.color = colorc
self.frame.rotate(angle=angle,axis=axis,origin=origin)
def rotate(self):
self._rotate()
rate(delay)
def rotateOnce(self):
for i in loopcount:
self.rotate()
def hide(self):
self.hideVert()
self.hideEdge()
self.hideFace()
def show(self):
self.showVert()
self.showEdge()
self.showFace()
def hideVert(self):
for v in self.visvert:
v.visible = 0
def showVert(self):
for v in self.visvert:
v.visible = 1
def hideFace(self):
for f in self.visface:
f.visible = 0
def showFace(self):
for f in self.visface:
f.visible = 1
def hideEdge(self):
for e in self.visedge:
e.visible = 0
def showEdge(self):
for e in self.visedge:
e.visible = 1
def demo(self):
self.show()
self.rotateOnce()
self.hide()
self.showVert()
self.rotateOnce()
self.hideVert()
self.showEdge()
self.rotateOnce()
self.hideEdge()
self.showFace()
self.rotateOnce()
self.hide()
class Tetra(Hedron):
def __init__(self, dual=0, small=0, origin=origin):
self.origin = origin
self.visvert = []
self.visface = []
self.visedge = []
self.frame = frame()
for i in numTetraVert:
colora = nexta()
if (dual):
self.visvert.append(sphere(frame=self.frame, pos=tetravert1[i], radius=0.2,color=colora))
elif(small):
self.visvert.append(sphere(frame=self.frame, pos=tetravert3[i], radius=0.2,color=colora))
else:
self.visvert.append(sphere(frame=self.frame, pos=tetravert2[i], radius=0.2,color=colora))
for i in numTetraFace:
colorb = nextb()
colorc = nextc()
if (dual):
self.visedge.append(curve(frame=self.frame, pos=tetraface1[i],color=colorb,radius=0.05))
self.visface.append(convex(frame=self.frame, pos=tetraface1[i],color=colorc))
elif(small):
self.visedge.append(curve(frame=self.frame, pos=tetraface3[i],color=colorb,radius=0.05))
self.visface.append(convex(frame=self.frame, pos=tetraface3[i],color=colorc))
else:
self.visedge.append(curve(frame=self.frame, pos=tetraface2[i],color=colorb,radius=0.05))
self.visface.append(convex(frame=self.frame, pos=tetraface2[i],color=colorc))
def move(self, newpos=(0,0,0)):
self.frame.pos = newpos
class DualTetra(Hedron):
def __init__(self):
self.t = [None,None]
self.t[0] = Tetra()
self.t[1] = Tetra(dual=1)
def _rotate(self):
for t in self.t:
t._rotate()
def hideVert(self):
for t in self.t:
t.hideVert()
def showVert(self):
for t in self.t:
t.showVert()
def hideEdge(self):
for t in self.t:
t.hideEdge()
def showEdge(self):
for t in self.t:
t.showEdge()
def hideFace(self):
for t in self.t:
t.hideFace()
def showFace(self):
for t in self.t:
t.showFace()
class MultiTetra(DualTetra):
def __init__(self):
self.t = [None,None,None,None]
self.t[0] = Tetra(small=1)
self.t[1] = Tetra(small=1)
self.t[2] = Tetra(small=1)
self.t[3] = Tetra(small=1)
for i in range(4):
self.t[i].move(tetravert3[i])
def _rotate(self):
for t in self.t:
t._rotate(t.frame.pos) # rotate each mini tetra on it's own axis
t._rotate((0,0,0)) # rotate whole multi-tetra
class Cube(Hedron):
def __init__(self):
self.visvert = []
self.visedge = []
self.visface = []
self.frame = frame()
for i in numCubeVert:
colora = nexta()
self.visvert.append(sphere(frame=self.frame, pos=cubevert[i], radius=0.2, color=colora))
for i in numCubeFace:
colorb = nextb()
colorc = nextc()
self.visedge.append(curve(frame=self.frame, pos=cubeface[i], color=colorb, radius=0.05))
self.visface.append(convex(frame=self.frame, pos=cubeface[i], color=colorc))
class Icosa(Hedron):
def __init__(self):
self.visvert = []
self.visface = []
self.visedge = []
self.frame = frame()
for i in numIcoVert:
colora = nexta()
self.visvert.append(sphere(frame=self.frame, pos=icovert[i], radius=0.2, color=colora))
for i in numIcoFace:
colorb = nextb()
colorc = nextc()
self.visedge.append(curve(frame=self.frame, pos=icoface[i], color=colorb, radius=0.05))
self.visface.append(convex(frame=self.frame, pos=icoface[i], color=colorc))
icosa = Icosa()
icosa.hide()
tetra = Tetra()
tetra.hide()
dual = DualTetra()
dual.hide()
cube = Cube()
cube.hide()
multi = MultiTetra()
multi.hide()
scene.autoscale = 0
scene.scale = (0.5,0.5,0.5)
loopcount = range(180)
while 1:
tetra.demo()
dual.demo()
multi.demo()
cube.demo()
icosa.demo()
multi.showEdge()
while 0:
multi.rotateOnce()