Fehler Code

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 16:32

Hi

Mir wars grad langweilig und hab dein Programm mal ein wenig umgestellt.

Was mit dabei aufgefallen ist:
1. eine liste mit einer forschleife geht man nicht mit

Code: Alles auswählen

for i in range(len(liste)):
    print liste[i]

durch sondern einfacher so:

Code: Alles auswählen

for listItem in liste:
    print listItem


2. wofür hast du die commandFrame und RotationFrames usw erstellt? Die werden ja nicht wirklich gebraucht.

3. wofür ist die Kopie von self.corners nach self.points?

Also hier mal mein umgeschriebenes Programm, hab beim Berechnen und so gar nix geändert, nur die Lesbarkeit verbessert.

Code: Alles auswählen

edgeColor = "green"
dist = 7

import math
import copy
import Tkinter as Tk

class Cube(Tk.Canvas):
    def __init__(self,parent,*args, **kwargs):
        try:
            kwargs['width']
        except KeyError:
            kwargs['width'] = 500

        try:
            kwargs['height']
        except KeyError:
            kwargs['height'] = 500

        Tk.Canvas.__init__(self, parent, *args, **kwargs)
        self.root = parent




        self.center = kwargs['width']/2
        self.scale  = kwargs['width']/2.0*0.5

        self.points = [
            [-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),      # Unterseite
            (4,5),(5,7),(7,6),(6,4),      # Oberseite
            (0,4),(1,5),(3,7),(2,6)       # Verbindung
                     ]

        self.setAngle(1)
        self.setProjection(2,0,1)
        self.setRotation(2,0)
        self.setPerspective(1)

        self.lines = []
        for i in range(len(self.edges)):
            self.lines.append(self.create_line(0,0,0,0,width=2))

    def setProjection(self, axis0, axis1, axis2):
        self.ax0,self.ax1,self.ax2 = axis0, axis1, axis2

    def setRotation(self,rot1, rot2):
        self.rot1,self.rot2 = rot1, rot2

    def setAngle(self,deg):
        self.angle = deg

    def setPerspective(self,value):
        self.perspective = value

    def rotate(self, degree):
        w = degree*self.angle*math.pi/180.0
        co,si = math.cos(w), math.sin(w)
        ax1,ax2 = self.rot1,self.rot2
        for point in self.points:
            point[ax1],point[ax2] = co*point[ax1]-si*point[ax2],si*point[ax1]+co*point[ax2]

    def project(self):
        ax0,ax1,ax2 = self.ax0,self.ax1,self.ax2
        p = []

        if self.perspective:
            for point in self.points:
                f = dist/(dist-point[ax0]+1)
                p.append( (f*point[ax1],f*point[ax2],point[ax0]) )
        else:
            for point in self.points:
                p.append( (point[ax1],point[ax2],point[ax0]) )

        e = []
        for edge in self.edges:
            a,b = edge
            e.append( (p[a][0],p[a][1],p[b][0],p[b][1],edgeColor,(p[a][2]+p[b][2])/2.0) )

        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

    def show(self):
        lines = self.project()
        for canvasLine, line in zip(self.lines, lines):
            x0,y0 = line[0]*self.scale,line[1]*self.scale
            x1,y1 = line[2]*self.scale,line[3]*self.scale
            c = line[4]
            self.coords(canvasLine,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.itemconfigure(canvasLine,fill=c)
        self.update()
    def infiniteRotate(self):
        self.rotate(1)
        self.show()
        self.root.after(10, self.infiniteRotate)

root = Tk.Tk()
c = Cube(root, width=700, height=700, background="black")
c.pack()
c.infiniteRotate()
root.mainloop()


und so gehts auch ohne Probleme.

Gruss Rayo

PS: aber ich denke dass dir der Code nicht viel hilft, da du zuerst mal richtig Python und dann Tkinter anschauen solltest.
Benutzeravatar
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 16:48

joa hast recht so geht es auch

aber was ich nicht verstehe

was hast du da programmiert

Code: Alles auswählen


class Cube(Tk.Canvas):
    def __init__(self,parent,*args, **kwargs):
        try:
            kwargs['width']
        except KeyError:
            kwargs['width'] = 500

        try:
            kwargs['height']
        except KeyError:
            kwargs['height'] = 500

        Tk.Canvas.__init__(self, parent, *args, **kwargs)
        self.root = parent

      ...

        self.center = kwargs['width']/2
        self.scale  = kwargs['width']/2.0*0.5



und hier

Code: Alles auswählen

    def show(self):
        lines = self.project()
        for canvasLine, line in zip(self.lines, lines):
            x0,y0 = line[0]*self.scale,line[1]*self.scale
            x1,y1 = line[2]*self.scale,line[3]*self.scale
            c = line[4]
            self.coords(canvasLine,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.itemconfigure(canvasLine,fill=c)
        self.update()
    def infiniteRotate(self):
        self.rotate(1)
        self.show()
        self.root.after(10, self.infiniteRotate)


beim zweiten mein ich eher das mit def initeRotate was soll das infinite heißen
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 17:05

Hi

1.
Falls width und height nicht übergeben wird erstellt er width und height mit je 500 (Breite und Höhe der Canvas) pixel.

2.
infinite - einfach unendlich lang rotieren wegen dem root.after

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

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 17:40

hi

ja danke ich werde mir den code gleich noch einmal intensiver anschauen

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

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 22:56

hi

CM hat geschrieben:'# Rotieren aktivieren
Was macht der sinus und der cosinus hier? Die beiden Links, die ich Dir gegeben habe - vielleicht möchtest selber noch googlen - helfen best. weiter das zu beantworten.


- Rotation mit 2 Variablen
- achsen werden gedreht - objekt verändert sich
- es wird im uhrzeigersinn gedreht durch den winkel 0
- ausgangspunkt x und y
- neue position nach drehung x' und y'
-
Bild

Bild

http://mathworld.wolfram.com/RotationMatrix.html

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

In der euklidischen Ebene R^2 wird die Rotation um den Ursprung um den Winkel α im Uhrzeigersinn realisiert durch die Matrix

Bild

Die Drehung selbst wird durch die Multiplikation eines Vektors mit der Matrix durchgeführt:

Bild



http://de.wikipedia.org/wiki/Rotationsmatrix

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

ich hab es versucht in meinen eigenen worten zusammenzufassen außer unten das ist kopiert

was sollen die grafiken darstellen?
wie muss man das ausrechnen

Beispiel:

x1 x2
y1 y2

jetzt x1 durch y1
oder x1 durch x2
oder y1 durch y2

oder wie? bitte um hilfe damit ich verstehen kann wie sich der würfel dreht

_________________________________________________________

rayo hab noch 3 wortfragen zu dem code

für was steht:

- kwargs
- **kwargs
- *args

_________________________________________________________
nochmal rayo :)

Code: Alles auswählen

    def project(self):
        ax0,ax1,ax2 = self.ax0,self.ax1,self.ax2
        p = []

        if self.perspective:
            for point in self.points:
                f = dist/(dist-point[ax0]+1)
                p.append( (f*point[ax1],f*point[ax2],point[ax0]) )
        else:
            for point in self.points:
                p.append( (point[ax1],point[ax2],point[ax0]) )

        e = []
        for edge in self.edges:
            a,b = edge
            e.append( (p[a][0],p[a][1],p[b][0],p[b][1],edgeColor,(p[a][2]+p[b][2])/2.0) )


ich habe die else schleife rausgeholt geht auch ohne - ist das okay so ?
dann ....

e=[]
e steht doch für edge oder?
und
p=[]
p steht für point oder?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 23:10

Öhm das ist dein Code, hab an den Variabelnamen nicht viel geändert, das musst du schon selbst wissen. :)

zu **kwargs:
lies dir mal das durch Python Docu

Gruss
Zuletzt geändert von rayo am Dienstag 7. Juni 2005, 23:18, insgesamt 1-mal geändert.
Benutzeravatar
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 23:13

jetzt bin ich auch platt :wink:

wo stehen denn bitte diese namen in meinem code :wink:

- kwargs
- **kwargs
- *args
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 23:20

Ich meinte p und e --> Hier:

Code: Alles auswählen

   # 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


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

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 23:22

ja da hab ich ja auch nix gegen gesagt :lol:

ich hab dich um die abkürzungen gefragt :wink:
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 23:23

jo hab 2 beiträge weiter oben von mir noch einen link hinzugefügt (python doku)

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

Beitragvon -Sugar Princes- » Dienstag 7. Juni 2005, 23:24

hehe :P

aber erst nachträglich 8)

ja ich guck mal :wink:

_____________________________

*args = *arguments
**kwargs = **keywords

richtig?

es muss immer erst das wort mit einem (*) stehen danach das mit (**)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Dienstag 7. Juni 2005, 23:57

Hi

Ja ist für variable Anzahl von Parametern:
def test(*args) -> in *args landen alle test(1,'test', None) -> args = [1, 'test', None]

def test(**kwargs) -> in *kwargs landen alle keyword-arguments test(ein=1, test='nix da', rest=None) -> kwargs = {'ein':1,'test':'nix da', 'rest': None}

Bei Tkinter kann man ebe zimlich viele sachen als keyword-arguments übergeben, darum mach ich das dort, um es weiter zugeben beim init der canvas

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

Beitragvon -Sugar Princes- » Mittwoch 8. Juni 2005, 02:09

so hab jetzt mal deine sachen eingebaut etc.

und CM's Vorschlag mit Docstring ausprobiert aber jetzt kommt Fehlermeldung und er kann den würfel nicht zusammenbringen

denk mal das ich irgendwas im aufbau des docstrings falsch gemacht habe

bitte um hilfe

Code: Alles auswählen


class Cube(Tk.Canvas):   
"""
Würfel wird instanziert
"""
    def __init__(self,parent,*args, **kwargs):
       
        try:
            kwargs['width']
        except KeyError:
            kwargs['width'] = 500

        try:
            kwargs['height']
        except KeyError:
            kwargs['height'] = 500

        Tk.Canvas.__init__(self, parent, *args, **kwargs)
        self.root = parent

        self.center = kwargs['width']/2
        self.scale  = kwargs['width']/2.0*0.5
"""

- def __init__ = Aufruf einer starken privaten Methode, die nur innerhalb der Klasse gilt
- Erstellung eines Objektes in einer Klasse
- *args = * arguments; ** kwargs = * keywords arguments
  Alle Argumente mit einem Stern (*) stehen vor den Argumenten mit zwei Sternen (**)
- Falls width und height nicht übergeben werden, wird width und height mit je 500 (Breite und Höhe der Canvas) pixel erstellt
- Vaiable Anzahl von Parametern

  Beispiel:

  def test (*args)       ->   in *args landen alle test(1,'test',None)
  -> args = [1,'test',None]
 
  def test (**kwargs)    ->   in **kwargs landen alle Keyboard-arguments test (ein=1,test='nix da', rest=None)
  -> kwargs = {'ein':1,'test':'nix da','rest':None}

- Tkinter kann viele Sachen als Keyword-Arguments übergeben, Weitergabe beim __init__ des Canvas

"""


fehlermeldung im def __init__

3 uhr nachts ich geh mal schlafen :P - gute nacht :wink:
Benutzeravatar
-Sugar Princes-
User
Beiträge: 38
Registriert: Freitag 8. April 2005, 16:33
Wohnort: Krefeld

Beitragvon -Sugar Princes- » Mittwoch 8. Juni 2005, 21:50

mhh! sry leute da hab ich wohl irgendwie einen fehler eingebaut

hab es jetzt genauso wie es hier steht und es funktioniert :?

vll. ein tippfehler von mir irgendwo na ja wollte es euch nur sagen :)

Wer ist online?

Mitglieder in diesem Forum: cedsoft