Bewegbarer Würfel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

hi christian

also ich probiere es mal so genau wie möglich zu sagen

1.) oben ist der würfel in seiner ganzen form und man kann ihn drehen wie man will + geschwindigkeit regeln etc.
2.) ich habe probiert einfach nur das fenster zu erstellen und darin ein würfel der sich rotiert also ohne button ohne geschwindigkeit einfach nur der rotierende würfel
3.) klappt auch alles soweit nur dann wenn ich starten will kommt auf gut deutsch gar nix mehr

- z.b. fenster kommt nicht so groß wie oben sondern kleiner und da steht einfach nur würfel
- oder fenster wird erstellt mit buttons aber ich seh kein würfel in der mitte :(


ich hoffe ihr wisst jetzt was ich mein - einfach den würfel umwandeln damit er in einem fenster ist ohne die ganzen buttons bin schon den ganzen tag dabei aber noch bin ich nicht ganz dahinter gekommen also wer da was weiß bzw. mir helfen will bitte melden :wink:

zur fehlerbeschreibung : da steht dann z.b. konnte xxx nicht finden :( [ xxx = beispiel ]

edit: mit xxx mein ich einfach befehle die dann irgendwo fehlen damit das läuft :roll: :?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Also ich versteh auch nicht was die ganze Aufregung soll.

@-Sugar Princes-:
Hast Du schon mal gesehen was Leonidas gepostet hat? Ist das nicht genau das was Du willst?

Gruß, mawe
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

mawe hat geschrieben:Hi!

@-Sugar Princes-:
Hast Du schon mal gesehen was Leonidas gepostet hat? Ist das nicht genau das was Du willst?

Gruß, mawe
hi mawe ups das hab ich ja voll übersehen :oops:
haben anscheinend fast gleich gepostet sodass mein post auf die zweite seite kam und ich dachte da is nix neues aber jetzt wo du es sagst

hab es gleich mal ausprobiert - hatte zwar kurze start probleme was aber nicht an den befehlen liegt sondern einen anderen grund hatte aber es lief dann doch ich werde es mir jetzt noch mal in ruhe anschauen

danke nochmal :)
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

mawe hat geschrieben:Hi!

@-Sugar Princes-:
Hast Du schon mal gesehen was Leonidas gepostet hat? Ist das nicht genau das was Du willst?

Gruß, mawe
so noch mal dahin zurück jupp is es hab mir das jetzt mal die letzten tagen angeschaut und versucht dadurchzukommen hab immer direkt definitionen dabei geschrieben was da gerade passiert

ich hab leider das gefühl das vll. etwas zu ungenau ist bzw. bei einigen sachen kam ich ins stocken :? [ siehe # zeichen wo nix hinter steht ]

kannst du dir das mal bitte anschauen oder ein anderer vielleicht

hab da noch ein paar sachen rausgenommen die leonidas drin gelassen hat da die ja hier nicht gebraucht werden die buttons und so sind ja deaktiviert daher auch der aufruf der farbe am anfang

----------------------------------------------------------------------------------

Code: Alles auswählen

useIDLE = 0
# colors of cubes (timecube,realcube,connectioncube)
# Farbe des Würfels (Zeitwürfel, realer Würfel , Verbindungswürfel)
e_colors = [0,"#8080ff","#ff0000","#70d090"]
# delay for animation
# Verzögerung für Animationen
showdelay = 20  #50
# centric projection distance
# zentraler Projektionsabstand ??
dist = 7
# background of canvas if necessary
# Hintergrund der Grafik falls vorhanden
canvascolor = "#ffffff" #None  # "#rrggbb"

# 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:
    # Eingebaute Funktion
    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

    # Erstelle Grafikfenster für Würfel
    def resetcube(self):
        self.points = copy.deepcopy(self.corners)
        ## print "cube resetted!"
        #  Schreibe Würfel - Start ??

    def setproj(self,params):
        self.ax0,self.ax1,self.ax2 = params
        ## print "Proj.",self.ax0,self.ax1,self.ax2
        # 

    def setrot(self,params):
        self.rot1,self.rot2 = params
        ## print "Rot",self.rot1,self.rot2
        # Farbe des Würfels = Rot
   
    def setangle(self,deg):
        self.angle = deg
        ## print "Angle:",self.angle
        # Wähle Winkel des Würfels aus

    # Perspektive des Würfels hier 3D
    def setperspective(self,value):
        self.perspective = value
        ## print "Perspective:",value
        # Wähle 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
        # Einsatzart
        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 Projektes       
class ProjectionFrame(Frame):
    # Eingebaute Funktion
    # Definiere Abkürzungen
    def __init__(self,parent,hypercube, hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.hcube = hypercube
        self.hcanvas = hcanvas

        self.projvar = IntVar()
        self.projvar.set(1)

        self.perspvar = IntVar()
        self.perspvar.set(2)

    # 
    def projjob(self,values):
        self.hcube.setproj(values)
        self.hcanvas.show()

    #
    def perspjob(self,values):
        self.hcube.setperspective(values)
        self.hcanvas.show()

# 
class RotationFrame(Frame):
    # Eingebaute Funktion
    def __init__(self,parent,hypercube,hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.hcube = hypercube

    #
    def rotjob(self,values):
        self.hcube.setrot(values)

#
class CommandFrame(Frame):
    # Eingebaute Funktion
    def __init__(self,parent,hypercube, hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.hcanvas = hcanvas

    #
    def degreeset(self,event):
        self.hcube.setangle(self.tempo.get())

    #
    def turnjob(self,param):
        self.hcanvas.setjob(param)

#
class HyperCanvas(Canvas):
    # Eingebaute Funktion
    def __init__(self,parent,hcube,numx,numy):
        Canvas.__init__(self)
        self.running = 0
        self.hcube=hcube
        self.OFFS = 5
        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 update(self):
        self.cv.update()

    #
    def stop(self):
        self.running = 0

    #
    def dothejob(self,code):
        if code==0:
            self.stop()
            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==-2:
            self.running=1
            while self.running:
                self.hcube.rotate(-1)
                self.show()
                self.after(showdelay)
        elif code==10:
            self.show()

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

# Einstellen des Rahmes (Größe, Ränderdicke) und Eingabe es Titels und des Textes       
class CubeShow:

    # Eingebaute Funktion
    def __init__(self,axname):
        hypercube = HCube()
       
        self.root = Tk()
        self.root.title("Würfel von -Sugar Princes-")

        Label(self.root,text="Würfel",font=("Arial",24)). \
        grid(row=0,column=0,columnspan=3,pady=3)

        canvas = HyperCanvas(self.root,hypercube,500,500)

        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)

        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)

        frame_bottom = CommandFrame(self.root,hypercube, canvas,
                       axname,relief=SUNKEN, borderwidth=2)
        frame_bottom.grid(row=2,column=0,columnspan=3,pady=6)

        self.root.after(250)
        self.root.update()
       
        hypercube.setangle(1)

        hypercube.resetcube()
        frame_left.projjob((2,0,1)) # z->xy          # Drehungsrichtung des Würfels
        frame_left.perspjob(1)      # centric        # zentriert ??
        frame_right.rotjob((2,0))   # rotate in yz   # Rotiere in yz (Drehungsrichtung)

        frame_bottom.turnjob(0)     # stop          # wenn man das löscht trotzdem funzt; notwendig ?!

        frame_bottom.turnjob(2)     # stop          # ????

        if not useIDLE: self.root.mainloop()

x = CubeShow("xyzt")
#x = CubeShow("1234")
# Zuordnung der Buchstaben zu den Zahlen
------------------------------------------------------------------------------

beim beenden des würfels wird noch eine fehlermeldung angezeigt is da was was nicht sein sollte?

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 292, in ?
    x = CubeShow("xyzt")
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 288, in __init__
    frame_bottom.turnjob(2)     # stop          # ????
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 168, in turnjob
    self.hcanvas.setjob(param)
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 198, in setjob
    self.dothejob(code)
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 226, in dothejob
    self.show()
  File "C:\Dokumente und Einstellungen\Standard\Desktop\Rotierender Würfel.pyw", line 246, in show
    int(0.5+self.center+x1),int(0.5+self.center-y1))
  File "H:\INFORM~1\Phyton\lib\lib-tk\Tkinter.py", line 2039, in coords
    self.tk.splitlist(
TclError: invalid command name ".13799992"
-----------

danke schonmal im voraus :)
Zuletzt geändert von -Sugar Princes- am Montag 11. April 2005, 17:09, insgesamt 1-mal geändert.
BlackJack

Jetzt soll Dir also jemand das Programm erklären helfen, das von Dir ist, und von dem Dein Lehrer nicht geglaubt hätte, das Du das hinbekommst!? Interessant. :wink:
Gast

BlackJack hat geschrieben:Jetzt soll Dir also jemand das Programm erklären helfen, das von Dir ist, und von dem Dein Lehrer nicht geglaubt hätte, das Du das hinbekommst!? Interessant. :wink:
1. sollen is der falsche ausdruck es is ne bitte von mir zwinge ich euch dazu nein also :wink:
2. wenn es nen lehrer gibt dann weiß er noch nix vom würfel - wenn ich was mache dann mache ich es richtig dauert zwar länger aber okay das nehm ich halt bei allen sachen in kauf :D
3. hab ich gefragt wer mir helfen kann will tut - was is daran so schwer ? :shock:
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

hmmm dann nich =)

dann muss ich halt bissel googlen aber passt schon :wink:
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

-Sugar Princes- hat geschrieben: dann muss ich halt bissel googlen aber passt schon
Bei allem Respekt, aber ich glaube nun unabbringlich von meinem Verdacht zu sein, dass da irgendjemand nur leichtes Spiel und eine gute=hohe Punktzahl erzielte...

Ich bin mir dessen im klaren, dass Diskussionen darüber schon oft geführt wurden, aber ist es nich peinlich mit anzusehen, wie jemand der Meinung ist, ein solch mehr oder weniger komplexes programm auf die Beine zu stellen, wenn er
weder erkannt hat, dass der computerbildschirm ungeeignet für die Messung der Seitenzahlen ist
nennt ihr sowas keine ahnung von phyton 7 Seiten Programmierung die funktioniert
(und meiner Meinung nach SONST nur ein Buch eine derartige zahl an Seiten für so wenig Quelltext aufbringen kann...),
noch, dass diese Person erkannt hat, dass grafische Benutzeroberfläche übersetzt sowas wie GUI(GraphicalUserInterface) bedeutet und somit in Tk, Wx oder ähnliches gepostet werden müsste.

Und wenn die Beschreibung dazu im Buch 500 Seiten hätte, darf man trotzdem nicht zu faul sein, sie sich wenigstens im
gröbsten Maaße durch zu lesen!
Und wenn man lieber ausprobiert, sollte man doch in der Lage sein, englische Texte (in diesem Fall Fehlermeldungen) zu verstehen...
Fazit:
Wer lesen kann, ist klar im Vorteil!

Nicht, dass man mal zugeben könnte, dass man es nicht selbst geschrieben (wobei ABschreiben aus der Wertung fällt) hat, muss man noch in der für alle zugänglichen Testverion eine Provokation einfügen, nur um wenigstens EINEN Teil selbst dazu beigetragen zu haben, oder sollte ich mich darin irren? Wenn dies zu bestätigen ist, ziehe ich im größten Maaße der Entschuldigung meine Punkte der Anklage zurück.
Jedoch sehe ich mich sonst innerlich dazu gezwungen, gegen die guten Absichten von
Sugar Prince
zu protestieren, denn alles in Allem finde ich den Beitrag des rotierenden Würfels lächerlich und eine Zumutung für jeden, der täglich bereit ist, den Helfenswerten zu helfen, um es mit dieser Art der Alliteration abschließend auszudrücken.

Ich wünsche allen anderen einen schönen Sonntag
Hannes
BlackJack

Meine Güte, da hast Du aber einen alten Thread wiederbelebt. ;-)
Brok3r
User
Beiträge: 29
Registriert: Montag 24. Oktober 2005, 13:48

Ja dachte ich eben auch nachdem ich mich mühsam durch alle posts gewelzt habe aber nie aufs Datum geachtet habe :lol:
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

lol dito
Antworten