You are not logged in Log in Join
You are here: Home » Members » DaddyGravity » ContagiousFun » SynergyPy » wikipage_view

Log in
Name

Password

 
 
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()