----------------------------------------------------------------------------------
Code: Alles auswählen
# Farbe des Würfels (timecube,realcube,connectioncube)
e_colors = [0,"#8080ff","#ff0000","#70d090"]
# Geschwindigkeit der Rotation
showdelay = 20
# centric projection distance
dist = 7
# Hintergrund Farbe
canvascolor = "blue"
# Importiere: Tkinter Befehle;bestimmte mathematische Funktionen;
# copy für befehle die z.b. nicht durch [:] kopiert werden.
from Tkinter import *
import math
import copy
# Würfel
class HCube:
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self):
# Ecken des Würfels
self.corners = [[-1.0,-1.0,-1.0,-1.0],[ 1.0,-1.0,-1.0,-1.0],
[-1.0, 1.0,-1.0,-1.0],[ 1.0, 1.0,-1.0,-1.0],
[-1.0,-1.0, 1.0,-1.0],[ 1.0,-1.0, 1.0,-1.0],
[-1.0, 1.0, 1.0,-1.0],[ 1.0, 1.0, 1.0,-1.0],
[-1.0,-1.0,-1.0, 1.0],[ 1.0,-1.0,-1.0, 1.0],
[-1.0, 1.0,-1.0, 1.0],[ 1.0, 1.0,-1.0, 1.0],
[-1.0,-1.0, 1.0, 1.0],[ 1.0,-1.0, 1.0, 1.0],
[-1.0, 1.0, 1.0, 1.0],[ 1.0, 1.0, 1.0, 1.0]]
# Ränder des Würfels
self.edges = [(0,1),(1,3),(3,2),(2,0), # bottom1 # 1.Unterseite
(4,5),(5,7),(7,6),(6,4), # top1 # 1.Oberseite
(0,4),(1,5),(3,7),(2,6), # sides1 up # 1.Seite oben
(8,9),(9,11),(11,10),(10,8), # bottom2 # 2.Unterseite
(12,13),(13,15),(15,14),(14,12), # top2 # 2.Oberseite
(8,12),(9,13),(11,15),(10,14), # sides2 up # 2. Seite oben
(0,8),(1,9),(3,11),(2,10), # connect 1,2 # Verbindung von 1 und 2
(4,12),(5,13),(7,15),(6,14)]
# Randfarben des Würfels
self.edgecolors=[e_colors[1]]*12+[e_colors[2]]*12+[e_colors[3]]*12
# Punkte = Ecken
self.points = copy.deepcopy(self.corners)
# Würfelperspektive
self.perspective=0
def setproj(self,params):
self.ax0,self.ax1,self.ax2 = params
# print "Proj.",self.ax0,self.ax1,self.ax2
# Aufruf: "Rahmen setzen / erstellen"
def setrot(self,params):
self.rot1,self.rot2 = params
# print "Rot",self.rot1,self.rot2
# Aufruf: "Rotation wird gesetzt"
def setangle(self,deg):
self.angle = deg
# print "Angle:",self.angle
# "Winkel des Würfels"
# Perspektive des Würfels hier 3D
def setperspective(self,value):
self.perspective = value
# print "Perspective:",value
# "Perspektive des Würfels, Wert"
# Rotieren aktivieren
def rotate(self,direction):
w = direction*self.angle*math.pi/180.0
co,si = math.cos(w), math.sin(w)
ax1,ax2 = self.rot1,self.rot2
for c in self.points:
c[ax1],c[ax2] = co*c[ax1]-si*c[ax2],si*c[ax1]+co*c[ax2]
# Würfel wird zusammengesetzt
def project(self):
ax0,ax1,ax2 = self.ax0,self.ax1,self.ax2
p = [0]*len(self.points)
# project points
if self.perspective:
for i in range(len(p)):
f = dist/(dist-self.points[i][ax0]+1)
p[i]=(f*self.points[i][ax1],f*self.points[i][ax2],self.points[i][ax0])
else:
for i in range(len(p)):
p[i]=(self.points[i][ax1],self.points[i][ax2],self.points[i][ax0])
e = [0]*len(self.edges)
for i in range(len(e)):
a,b = self.edges[i]
e[i] = (p[a][0],p[a][1],p[b][0],p[b][1],self.edgecolors[i],(p[a][2]+p[b][2])/2.0)
# insert sort
for stelle in range(1,len(e)):
wert = e[stelle]
i = stelle
while 1:
if i==0: break
if e[i-1][5]<=wert[5]: break
e[i]=e[i-1]
i = i-1
e[i] = wert
return e
# Rahmenerstellung des Würfels
class ProjectionFrame(Frame):
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,parent,hypercube, hcanvas, axname,**options):
Frame.__init__(self,parent,**options)
self.hcube = hypercube
self.hcanvas = hcanvas
# Aufruf "Rahmen erstellen"
def projjob(self,values):
self.hcube.setproj(values)
self.hcanvas.show()
# Aufruf "Perspektive des Würfels beginnen"
def perspjob(self,values):
self.hcube.setperspective(values)
self.hcanvas.show()
# Rotieren des Würfels
class RotationFrame(Frame):
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,parent,hypercube,hcanvas, axname,**options):
Frame.__init__(self,parent,**options)
self.hcube = hypercube
# Aufruf "Rotation beginnen"
def rotjob(self,values):
self.hcube.setrot(values)
# Kommandos des Würfels
class CommandFrame(Frame):
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,parent,hypercube, hcanvas, axname,**options):
Frame.__init__(self,parent,**options)
self.hcanvas = hcanvas
# Auftrag beginnen "Rotation starten"
def turnjob(self,param):
self.hcanvas.setjob(param)
# Würfel
class HyperCanvas(Canvas):
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,parent,hcube,numx,numy):
Canvas.__init__(self)
self.running = 0
self.hcube=hcube
self.numx, self.numy = numx, numy
self.center = numx/2
self.scale = numx/2.0*0.5
if canvascolor:
self.cv = Canvas(parent,width=self.numx+7,height=self.numy+7,
background=canvascolor)
else:
self.cv = Canvas(parent,width=self.numx+7,height=self.numy+7)
self.cv.grid(row=1,column=1,padx=3,pady=3)
self.lines=[0]*len(hcube.edges)
for i in range(len(self.lines)):
self.lines[i]=self.cv.create_line(0,0,0,0,width=2)
#
def setjob(self,code):
self.job = code
# print "Job:",self.job
self.dothejob(code)
#
def dothejob(self,code):
if code==0:
self.cv.after(100)
self.cv.update()
elif code==1:
self.running=0
self.hcube.rotate(1)
self.show()
elif code==-1:
self.running=0
self.hcube.rotate(-1)
self.show()
elif code==2:
self.running=1
while self.running:
self.hcube.rotate(1)
self.show()
self.after(showdelay)
elif code==10:
self.show()
# Würfel
def show(self):
# print "Showing!"
lines = self.hcube.project()
for i in range(len(lines)):
x0,y0 = lines[i][0]*self.scale,lines[i][1]*self.scale
x1,y1 = lines[i][2]*self.scale,lines[i][3]*self.scale
c = lines[i][4]
self.cv.coords(self.lines[i],int(0.5+self.center+x0),int(0.5+self.center-y0),
int(0.5+self.center+x1),int(0.5+self.center-y1))
self.cv.itemconfigure(self.lines[i],fill=c)
self.cv.update()
# Feinheiten des Würfels (u.a. Größe)
class CubeShow:
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,axname):
hypercube = HCube()
self.root = Tk()
# Größe des Würfels
canvas = HyperCanvas(self.root,hypercube,900,900)
# Aufbau / Umrandung / Rahmen des Würfels
frame_left = ProjectionFrame(self.root, hypercube, canvas,axname, relief=FLAT, borderwidth=2)
frame_left.grid(row=1,column=0,padx=3,pady=3,sticky=N)
# Rotationsaufbau des Würfels
frame_right = RotationFrame(self.root,hypercube,canvas,
axname, relief=FLAT, borderwidth=2)
frame_right.grid(row=1,column=2,padx=3,pady=3,sticky=N)
# Aufbau
frame_bottom = CommandFrame(self.root,hypercube, canvas,
axname,relief=SUNKEN, borderwidth=2)
frame_bottom.grid(row=2,column=0,columnspan=3,pady=6)
hypercube.setangle(1)
frame_left.projjob((2,0,1)) # z->xy # Drehungsrichtung des Würfels
frame_left.perspjob(1) # centric
frame_right.rotjob((2,0)) # rotate in yz # Rotiere in yz (Drehungsrichtung)
frame_bottom.turnjob(2) # "Auftrag beginnen"
x = CubeShow("xyzt")
#x = CubeShow("1234")
# Zuordnung der Buchstaben zu den Zahlen