jetzt weiß ich wo ich noch dran arbeiten muss
hier mal mein geänderter code den ich euch posten wollte falls noch interesse besteht mir zu helfen
denke jetzt ist der richtige zeitpunkt dafür
Code: Alles auswählen
useIDLE = 0
# Farbe des Würfels
e_colors = "green"
# Verzögerung der Rotation
showdelay = 20
# Projektionsabstand zum Kern
dist = 7
# Hintergrund Farbe
canvascolor = "black"
# 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 ( das schau ich nochmal nach )
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]]
# Ränder des Würfels
self.edges = [(0,1),(1,3),(3,2),(2,0), # Unterseite
(4,5),(5,7),(7,6),(6,4), # Oberseite
(0,4),(1,5),(3,7),(2,6)] # Verbindung
# Randfarben des Würfels
self.edgecolors=[e_colors]*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
# Aufruf: "Rahmen erstellen"
# Ausgabe "Projektion.",self.ax0,self.ax1,self.ax2
def setrot(self,params):
self.rot1,self.rot2 = params
# Aufruf: "Rotation wird gesetzt"
# Ausgabe "Rotation",self.rot1,self.rot2
def setangle(self,deg):
self.angle = deg
# "Winkel des Würfels"
# Ausgabe Winkel
# Perspektive des Würfels hier 3D
def setperspective(self,value):
self.perspective = value
# Ausgabe "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 (guck ich auch nochmal nach)
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"
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 Eigenschaften / Feinheiten
class HyperCanvas(Canvas):
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,parent,hcube,numx,numy):
Canvas.__init__(self)
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)
# Job starten
def setjob(self,code):
self.job = code
# print "Job:",self.job
self.dothejob(code)
# Rotation wiederholen aktivieren (schleife)
def dothejob(self,code):
if code==0:
self.cv.update()
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 zeigen
def show(self):
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()
# Würfelerscheinen
class CubeShow:
# Neue (Objekt-) Instanz wird erzeugt
def __init__(self,axname):
hypercube = HCube()
self.root = Tk() # main window
# Größe des Würfels
canvas = HyperCanvas(self.root,hypercube,900,900)
# Zuordnung
frame_left = ProjectionFrame(self.root,hypercube,canvas,axname,relief=FLAT)
frame_right = RotationFrame(self.root,hypercube,canvas,axname,relief=FLAT)
frame_bottom = CommandFrame(self.root,hypercube,canvas,axname,relief=SUNKEN)
hypercube.setangle(1)
# Aufruf
frame_left.projjob((2,0,1)) # z->xy
frame_left.perspjob(1) # centric
frame_right.rotjob((2,0)) # rotate in yz
frame_bottom.turnjob(2) # "Auftrag beginnen"
if not useIDLE: self.root.mainloop()
# Quit Button
def Quit():
root.destroy()
# Haupt Fenster
root = Tk()
bobby = Button(text = 'Quit', command = root.destroy)
bobby.pack()
x = CubeShow("xyzt")
#x = CubeShow("1234")
# Zuordnung der Buchstaben zu den Zahlen
falls ich das mit dem quit nicht hinkriege nehme ich es ganz raus, ja ich weiß ist nciht gerad die feine art aber besser als wenn da was unvollständiges oder falsches drin ist
ja hier sind noch paar sachen drin die verbesserungswürdig sind - ich werde daran arbeiten
Jetzt werde ihr wieder gefordert, jetzt wirklich ehrliclh gesagt - sowas find ich super