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-

Donnerstag 7. April 2005, 15:07

Hallo :)
ehm... ich hab hier so einen würfel, der dreht sich und man kann ihn auch verstellen, also das der sich auch in eine andere richtung dreht und so.
aber mein problem jetzt:
wenn ich die funktionen weg mache, (da ich will das er sich nur in eine richtung bewegt), funktioniert er nicht mehr.
könnt ihr mir vielleicht helfen und mir sagen wie ich die funktionen wegmachen kann, ohne das es nicht mehr funktioniert oder wie die funktion für nur einen würfel ist der sich nur in eine richtung bewegt und sonst nichts macht??
das ist ja dann doch die funktion für einen quader + bewegung, oder?!?!

danke,eure sugar princes :)

Und hier ist mein Würfel.... (in Python), bitte helft mir!!

Code: Alles auswählen

useIDLE = 0

# colors of cubes (timecube,realcube,connectioncube)
e_colors = [0,"#8080ff","#ff0000","#70d090"]

# delay for animation
showdelay = 20  #50
# centric projection distance
dist = 7
# background of canvas if necessary
canvascolor = "#ffffff" #None  # "#rrggbb"
# color for selected buttons
buttoncolor = "#c080a0"

from Tkinter import *
import math
import copy

class HCube:
    def __init__(self):
        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]]
        self.edges = [(0,1),(1,3),(3,2),(2,0),      # bottom1              
                 (4,5),(5,7),(7,6),(6,4),           # top1
                 (0,4),(1,5),(3,7),(2,6),           # sides1 up
                 (8,9),(9,11),(11,10),(10,8),       # bottom2
                 (12,13),(13,15),(15,14),(14,12),   # top2
                 (8,12),(9,13),(11,15),(10,14),     # sides2 up
                 (0,8),(1,9),(3,11),(2,10),         # connect 1,2
                 (4,12),(5,13),(7,15),(6,14)]
        self.edgecolors=[e_colors[1]]*12+[e_colors[2]]*12+[e_colors[3]]*12
        self.points = copy.deepcopy(self.corners)
        self.perspective=0

    def resetcube(self):
        self.points = copy.deepcopy(self.corners)
        ## print "cube resetted!"

    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 
    
    def setangle(self,deg):
        self.angle = deg
        ## print "Angle:",self.angle


    def setperspective(self,value):
        self.perspective = value
        ## print "Perspective:",value
        
    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]
    
    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
    
            
        
class ProjectionFrame(Frame):
    def __init__(self,parent,hypercube, hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.hcube = hypercube
        self.hcanvas = hcanvas

        Label(self,text="Projection\naxis to plane",
              font=("Arial",10)).pack(side=TOP,fill=X,padx=5,pady=10) 

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

        i=1
        for p in [(2,0,1),(1,2,0),(0,1,2),(3,0,1),(3,2,0),(3,1,2),
                  (2,0,3),(2,1,3),(1,0,3),(1,2,3),(0,1,3),(0,2,3)]:
            t = axname[p[0]]+"->"+axname[p[1]]+axname[p[2]]
            Radiobutton(self,text=t,font=("Courier",8),variable=self.projvar,
                        value=i, indicatoron=0,selectcolor=buttoncolor,
                        command=lambda par=p: self.projjob(par)
                         ).pack(side=TOP,padx=15)

            if i in [3,6,12]:
                Label(self,text=" ",
                      font=("Arial",1)).pack(side=TOP,pady=0) 
            i += 1

        self.perspvar = IntVar()
        self.perspvar.set(2)
        Radiobutton(self,text="parallel",font=("Arial",10),variable=self.perspvar,
                        value=1, indicatoron=0,selectcolor=buttoncolor,
                        command=lambda par=0: self.perspjob(par)
                         ).pack(side=TOP,padx=2,fill=X)
        Radiobutton(self,text="centric",font=("Arial",10),variable=self.perspvar,
                        value=2, indicatoron=0,selectcolor=buttoncolor,
                        command=lambda par=1: self.perspjob(par)
                         ).pack(side=TOP,padx=2,fill=X)


    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):
    def __init__(self,parent,hypercube,hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.parent = parent
        self.hcube = hypercube
        self.hcanvas = hcanvas

        Label(self,text="Rotation\nin plane",
              font=("Arial",10)).pack(side=TOP,fill=X,padx=5,pady=10) 

        self.rotplane = IntVar()
        self.rotplane.set(3)

        for value,pars in [(1,(0,1)),(2,(1,2)),(3,(2,0)),
                                (4,(0,3)),(5,(1,3)),(6,(2,3))]:
            t = axname[pars[0]]+axname[pars[1]]
            Radiobutton(self,text=t,font=("Arial",10),variable=self.rotplane,
                        value=value, indicatoron=0,selectcolor=buttoncolor,
                        command=lambda par=pars: self.rotjob(par)
                        ).pack(side=TOP,fill=X,padx=5)

        Label(self,text=" ",font=("Arial",20)).pack(side=TOP,fill=X,padx=5,pady=20) 
        self.killer = Button(self,text="Q\nU\nI\nT",font=("Arial",16),
                             command=self.quit,padx=4,pady=5)
        self.killer.pack(side=TOP,fill=X,padx=5)


    def rotjob(self,values):
        self.hcube.setrot(values)
 
    def quit(self):
        self.hcanvas.setjob(0)
        self.parent.after(200)
        ## print "Finished!\n"
        self.parent.destroy()


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


        self.cubereset = Button(self,text="reset\ncube",font=("Arial",10),
                             command=self.resetjob,padx=4,pady=2)
        self.cubereset.pack(side=LEFT,fill=Y,pady=1,padx=4)


        self.tempo = Scale(self,orient=HORIZONTAL, from_=1, to_=15,
                           length=100,showvalue=1,repeatinterval=200,
                           command=self.degreeset)
        self.tempo.pack(side=LEFT,padx=20,pady=5)

        Label(self,text=" ",font=("Arial",10)).pack(side=LEFT,fill=X,padx=2,pady=10) 
        self.runback = Button(self,text="<<",font=("Arial",12),
                             command=lambda par=-2: self.turnjob(par),padx=4,pady=4)
        self.runback.pack(side=LEFT,fill=Y,padx=2,pady=5)

        self.back = Button(self,text="<",font=("Arial",12),
                             command=lambda par=-1: self.turnjob(par),padx=4,pady=4)
        self.back.pack(side=LEFT,fill=Y,padx=2,pady=5)

        self.stop = Button(self,text="stop",font=("Arial",12),
                             command=lambda par=0: self.turnjob(par),padx=4,pady=4)
        self.stop.pack(side=LEFT,fill=Y,padx=2,pady=5)

        self.step = Button(self,text=">",font=("Arial",12),
                             command=lambda par=1: self.turnjob(par),padx=4,pady=4)
        self.step.pack(side=LEFT,fill=Y,padx=2,pady=5)

        self.run = Button(self,text=">>",font=("Arial",12),
                             command=lambda par=2: self.turnjob(par),padx=4,pady=4)
        self.run.pack(side=LEFT,fill=Y,padx=2,pady=5)

        Label(self,text=" ",font=("Arial",10)).pack(side=LEFT,fill=X,padx=5,pady=10) 
        Label(self,text="Hehe Herr Bartling :D na wer kann es nicht :-) ",font=("Arial",8),
              fg="#4040ff").pack(side=LEFT,fill=X,padx=5,pady=1) 


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

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

    def resetjob(self):
        self.hcube.resetcube()
        self.hcanvas.setjob(10)
        self.hcanvas.show()

class HyperCanvas(Canvas):
    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()

                
    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()    
        
class CubeShow:

    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
        frame_left.perspjob(1)      # centric
        frame_right.rotjob((2,0))   # rotate in yz
        
        frame_bottom.turnjob(0)     # stop

        frame_bottom.turnjob(2)     # stop

        if not useIDLE: self.root.mainloop()

x = CubeShow("xyzt")
#x = CubeShow("1234")
Edit (Leonidas): Code in Python Tags gesetzt, da sonst unlesbar, auch nicht für Python selbst.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Donnerstag 7. April 2005, 17:52

..Herr Bartling..
:?: schon wieder Hausaufgabenhilfe?? :?:

gilt nicht nur für Studenten

mfg, querdenker
-Sugar Princes-

Donnerstag 7. April 2005, 18:46

das ist doch lediglich eine frage wo der fehler liegt das das programm (würfel) dann nicht mehr geht ?!

was seit ihr denn hier nix schüler nix studenten nix arbeiter (die die das beruflich machen) was ist das dann hier? :roll:

ich habe doch den würfel und er geht ja auch (rotiert) aber dann kriege ich immer fehlermeldungen das sowieso nicht definiert ist :(
-Sugar Princes-

Donnerstag 7. April 2005, 19:08

leider kommt es immer wieder vor, daß hier manche glauben, wir würden ihre Hausaufgaben lösen. Dafür ist dieses Forum echt nicht gedacht. Wenn einer bei einem Problem Hilfe braucht, geben wir gerne Hilfestellung, aber wenn hier Leute her kommen, die weder von Programmierung noch von Python eine Ahnung haben und glauben wir würden Ihnen fertige Lösungen liefern, so sind die hier falsch!
joa bevor sich hier keiner mehr meldet :!:

doben ist das der "besagte" ausschnitt :D

also ....

- 1. okay "Wenn einer bei einem Problem Hilfe braucht, geben wir gerne Hilfestellung," dann helft bitte
- 2. weiter "aber wenn hier Leute her kommen, die weder von Programmierung noch von Python eine Ahnung haben und glauben wir würden Ihnen fertige Lösungen liefern, so sind die hier falsch!" wenn ich keine ahnung hätte warum läuft dieser würfel dann das problem ist das da wenn ich was veränder eine fehlermeldung kommt - nennt ihr sowas keine ahnung von phyton 7 Seiten Programmierung die funktioniert das ist für mich bissel mehr als nix verstehen

also überlegt es euch noch bitte mal danke :)
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 7. April 2005, 19:32

Hi!

Schon gut, schon gut, ich bin auch der Meinung, dass Du hilfeempfangswürdig bist :)
Aber vorher: Hilf mir, Dir zu helfen (das is aus irgendeinem Film, oder? :D).
-Sugar Princes- hat geschrieben: wenn ich die funktionen weg mache
Welche Funktionen meinst Du? Beschreib bitte mal genau was Du machen willst und warums dann nicht funktioniert, damit ich das nachvollziehen kann (bevor ich mich durch den Code wühle :)).

BTW: Cooles Programm, wollte selbst auch schon mal so etwas machen, ... naja, ich wollte :?

Gruß, mawe
Gast

Donnerstag 7. April 2005, 21:06

mawe hat geschrieben:Hi!

Schon gut, schon gut, ich bin auch der Meinung, dass Du hilfeempfangswürdig bist :)
danke :cry: :) (weine vor freude 8) )
Aber vorher: Hilf mir, Dir zu helfen (das is aus irgendeinem Film, oder? :D).
-Sugar Princes- hat geschrieben: wenn ich die funktionen weg mache
kann ja mal hollywood fragen ob die nen film machen :wink:
Welche Funktionen meinst Du? Beschreib bitte mal genau was Du machen willst und warums dann nicht funktioniert, damit ich das nachvollziehen kann (bevor ich mich durch den Code wühle :)).
also das problem ist folgenes - hoffe du hast python :roll:

also wenn du das so öffnest ist da ja ein fenster das sich neu öffnet wo der würfel in der mitte rotiert

außen sind schalter links rechts sowie darunter

wenn ich jetzt aber die schalter wieder weg machen will funzt das programm nicht mehr - da der dann sagt xyz fehlt :roll:

hoffe du weißt ungefähr was ich meine !?

---------

kurz zusammengefasst: der würfel brauch sich nicht in verschiedene richtungen zu drehen sondern eine reicht das heißt man müsste "nur" die schalter kappen und die befehle die nicht mehr von nöten sind löschen - nur dann wenn ich das probiere funzt nix mehr :(
BTW: Cooles Programm, wollte selbst auch schon mal so etwas machen, ... naja, ich wollte :?

Gruß, mawe
joa immerhin - jetzt kannste ja gucken was du alles kannst :) bzw. was nicht

:wink:
-Sugar Princes-

Donnerstag 7. April 2005, 21:08

ups namen vergessen :lol:

----------

na ja noch was von euch:
Edit (Leonidas): Code in Python Tags gesetzt, da sonst unlesbar, auch nicht für Python selbst.
hi leonidas, was meinst du mit python tags? ich hab nicht ganz verstanden was du damit meinst? denk mal das is so ne kleinigkeit da ich das übersehe :?
BlackJack

Donnerstag 7. April 2005, 22:01

Anonymous hat geschrieben:wenn ich jetzt aber die schalter wieder weg machen will funzt das programm nicht mehr - da der dann sagt xyz fehlt :roll:
Ohne das Du etwas hinzufügst beschwert er sich das `xyz` fehlt? Ich meine das fehlt jetzt schon -- da ist nichts mit dem Namen `xyz`.

Das Programm da oben scheint in Ordnung zu sein. Da können wir Dir also nicht helfen. Mit Deinen dürftigen Fehlerbeschreibungen auch nicht.

Könntest Du Dich mal dazu herablassen nicht funktionierenden Quelltext zu zeigen und ein *genaue* Fehlerbeschreibung dazu zu geben!? Auf Ratespielchen hat hier keiner Lust.
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 8. April 2005, 00:03

Hallo Sugar Princes

Geniales Programm was du hier präsentierst!
-> GRATULATION <-
(Again: Python and Tkinter are very good companions!)

Habe in deinem Programm alle Schaltflächen mit
Ausnahme von 'QUIT' mittels ausdokumentieren
unwirksam gemacht und der Würfel dreht sich
bei mir hemmungslos weiter.

Mein Setup hier ist:

Python -> Version 2.3
LINUX -> SuSE 9.0

Gruss wuf :wink:
Take it easy Mates!
Gast

Freitag 8. April 2005, 00:13

hallo,...

mal abgesehen davon, dass ich das mit den schülern und studenten nicht so eng sehe, diskussion hatten wir schon, brauchen wir nicht mehr :D finde ich doch folgendes seltsam:
wenn ich keine ahnung hätte warum läuft dieser würfel dann das problem ist das da wenn ich was veränder eine fehlermeldung kommt - nennt ihr sowas keine ahnung von phyton 7 Seiten Programmierung die funktioniert das ist für mich bissel mehr als nix verstehen
also wenn ich das richtig verstanden habe, dann hast du das geschrieben. oder?
ich denke wenn, dann kann das gar nicht sein, dass du deine aufgabe nicht selber lösen kannst.

mfg

rolgal
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Freitag 8. April 2005, 09:07

@rolgal: Ich hatte auch nicht die Absicht, eine neue Diskussion über ein altes Thema neu anzuschieben. Du hast das geschrieben, was ich gedacht habe.

@sugar
was seit ihr denn hier nix schüler nix studenten nix arbeiter (die die das beruflich machen) was ist das dann hier?
Was wir sind? Ich spreche erstmal nur für mich: Jemand, der keine Lust hat die Arbeit anderer Leute zu machen.

mfg, querdenker
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 8. April 2005, 12:26

rolgal hat geschrieben:also wenn ich das richtig verstanden habe, dann hast du das geschrieben. oder?
ich denke wenn, dann kann das gar nicht sein, dass du deine aufgabe nicht selber lösen kannst.
Eben, das kommt mir auch seltsam vor. Ich denke nicht dass man sowas schafft, ohne zu wissen, wie man Buttons loswird.
-Sugar Princes- hat geschrieben:hi leonidas, was meinst du mit python tags? ich hab nicht ganz verstanden was du damit meinst? denk mal das is so ne kleinigkeit da ich das übersehe :?
Du hast deinen Code in Quote-phpBB-Tags gepostet. Dumm nur, dass Quote die Leerzeichen ignoriert. Aber ohne Leerzeichen versteht Python nicht wie das Programm ausgeführt werden soll, da ja Python durch die Einrückung die Funktionen aufteilt. Also gibt es in phpBB das Code-Tag.. und wir haben sogar eines, dass Syntaxhighlighting unterstützt, das Python-Tag.

Beispiel:
class Probability(object):
remaining = 100
field = []

def add(self, option, factor):
if factor <= self.remaining:
self.remaining -= factor
self.field.extend([option] * factor)
else:
self.field.extend([option] * factor - self.remaining)
self.remaining = 0

def random(self):
seed = len(self.field)
if seed < 100:
self.add(None, 100 - seed)
return random.choice(self.field)
gegen

Code: Alles auswählen

class Probability(object):
    remaining = 100
    field = []
    
    def add(self, option, factor):
        if factor <= self.remaining:
            self.remaining -= factor
            self.field.extend([option] * factor)
        else:
            self.field.extend([option] * factor - self.remaining) 
            self.remaining = 0
    
    def random(self):
        seed = len(self.field)
        if seed < 100:
            self.add(None, 100 - seed)
        return random.choice(self.field)
Was ist wohl besser?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

Freitag 8. April 2005, 16:39

querdenker hat geschrieben: Was wir sind? Ich spreche erstmal nur für mich: Jemand, der keine Lust hat die Arbeit anderer Leute zu machen.
mfg, querdenker
joa wer sagt denn arbeit =) brauch doch nur hilfe :wink: das programm steht ja :)

@Leonidas: jo jetzt weiß ich was du meinst sry das ich das falsch gepostet habe :oops:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 8. April 2005, 17:55

Irgendwie scheint mir die Diskussion hier wenig sachlich. Sugar Princess, Deine Anfrage war vielleicht nicht sonderlich präzise (solltest Du womöglich immer noch nachbessern), aber doch durchaus legitim. Es ist doch normal aus Codestücken, Beispielen, die man hat, ein Skript zusammenzusetzen und dann, gerade am Anfang nicht alles zu verstehen. (Oder was auch immer die Geschichtes dieses Programms ist.)
Ich verstehe nichts von Tkinter, da wäre also Zurückhaltung angebracht - wie mir scheint, aber auch bei anderen.

SCNR
Christian
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 8. April 2005, 19:00

CM hat geschrieben:Es ist doch normal aus Codestücken, Beispielen, die man hat, ein Skript zusammenzusetzen und dann, gerade am Anfang nicht alles zu verstehen.
Also wenn cih so gut Codesnippets zu funktionierenden Programmen bauen könnte, wär ich echt froh.
CM hat geschrieben:Ich verstehe nichts von Tkinter, da wäre also Zurückhaltung angebracht - wie mir scheint, aber auch bei anderen.
Ich verstehe auch nicht viel.. aber jetzt die anderen Funtionen rauszuschmeissen ist ja nicht schwer.

Sei's drum:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 
useIDLE = 0

# colors of cubes (timecube,realcube,connectioncube)
e_colors = [0,"#8080ff","#ff0000","#70d090"]

# delay for animation
showdelay = 20  #50
# centric projection distance
dist = 7
# background of canvas if necessary
canvascolor = "#ffffff" #None  # "#rrggbb"
# color for selected buttons
buttoncolor = "#c080a0"

from Tkinter import *
import math
import copy

class HCube:
    def __init__(self):
        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]]
        self.edges = [(0,1),(1,3),(3,2),(2,0),      # bottom1             
                 (4,5),(5,7),(7,6),(6,4),           # top1
                 (0,4),(1,5),(3,7),(2,6),           # sides1 up
                 (8,9),(9,11),(11,10),(10,8),       # bottom2
                 (12,13),(13,15),(15,14),(14,12),   # top2
                 (8,12),(9,13),(11,15),(10,14),     # sides2 up
                 (0,8),(1,9),(3,11),(2,10),         # connect 1,2
                 (4,12),(5,13),(7,15),(6,14)]
        self.edgecolors=[e_colors[1]]*12+[e_colors[2]]*12+[e_colors[3]]*12
        self.points = copy.deepcopy(self.corners)
        self.perspective=0

    def resetcube(self):
        self.points = copy.deepcopy(self.corners)
        ## print "cube resetted!"

    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
   
    def setangle(self,deg):
        self.angle = deg
        ## print "Angle:",self.angle


    def setperspective(self,value):
        self.perspective = value
        ## print "Perspective:",value
       
    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]
   
    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
   
           
       
class ProjectionFrame(Frame):
    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):
    def __init__(self,parent,hypercube,hcanvas, axname,**options):
        Frame.__init__(self,parent,**options)
        self.hcube = hypercube

    def rotjob(self,values):
        self.hcube.setrot(values)
 
    def quit(self):
        self.hcanvas.setjob(0)
        self.parent.after(200)
        self.parent.destroy()


class CommandFrame(Frame):
    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)

    def resetjob(self):
        self.hcube.resetcube()
        self.hcanvas.setjob(10)
        self.hcanvas.show()

class HyperCanvas(Canvas):
    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()

               
    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()   
       
class CubeShow:

    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
        frame_left.perspjob(1)      # centric
        frame_right.rotjob((2,0))   # rotate in yz
       
        frame_bottom.turnjob(0)     # stop

        frame_bottom.turnjob(2)     # stop

        if not useIDLE: self.root.mainloop()

x = CubeShow("xyzt")
#x = CubeShow("1234") 
Ist aber nur schnell zerlegt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten