Seite 1 von 1

Graphische Animation von num. Integration: Punkte zeichnen!

Verfasst: Freitag 26. Oktober 2007, 23:20
von gurke111
Hallo!

Ich möchte die Ergebnisse eines Bewegungsgleichungs-Integrations-Algorithmus' für ein Teilchen grafisch veranschaulichen. Sprich: Die Trajektorie des Teilchens darstellen.

Vom Prinzip her ist da ja schonmal der/die/das Canvas von Tkinter nicht ganz falsch oder? Aber wie schaffe ich es dort einfache Punkte zu zeichnen? Was ich eigentlich möchte ist vom Prinzip her ein weißer Hintergrund und dann blaue/grüne/bunte(scheissegal!) Punkte irgendeiner Dicke/Größe, an beliebigen Stellen (Koordinaten) auf dem Canvas. Also natürlich eigentlich an den Koordinaten, die der Integrationsalgorithmus ausrechnet, wobei ich die dann ja vielleicht noch anders skalieren muss..

Habt ihr Alternativen für meine Anwendung? Das gesamte Skript muss auf den Maschinen der Uni lauffähig sein. Dort gibt es Python 2.5. Ich muss auf die Python Standardlib zurückgreifen, um die Lauffähigkeit zu garantieren oder?

Verfasst: Samstag 27. Oktober 2007, 10:41
von schlangenbeschwörer
Hi,

Du könntes auch die PIL nehmen, aber für den Anfang ist Tkinter.Canvas wohl ausreichend.
Mit Canvas.create_oval(...) kannst du Punkte zeichen, als Koordinaten einfach die obere linke und untere rechte Ecke des Rechtecks (bzw. hier des Quadrats) angeben, in dem dein Punkt/Kreis liegen soll.
Mit der option "fill" kannst du das Innere des Kreises füllen, indem du eine beliebige Farbe angibst.
Damit müsstes du schon recht weit kommen, sonst guckste mal bei effbot.org oder in ner anderen Doku/Tutorial :wink:

Gruß

Verfasst: Samstag 27. Oktober 2007, 11:25
von gurke111
Okay, danke! Also gibt es wirklich keine konkrete Punktzeichnenmethode für Tkinter... ist ja lustig :)

Wegen der Standardbibliotheksache muss ich also auf Tkinter zurückgreifen, ja? PIL kann ich da also vergessen.

Wie schaut das mit der Geschwindigkeit aus? Ist es ein Problem ein Canvas mit meinetwegen zehntausenden Punkten (bzw kleinen gefüllten Kreisen) vollzumalen? Bleibt das Fenster fit wie ein Turnschuh?

Verfasst: Samstag 27. Oktober 2007, 11:51
von BlackJack
`Tkinter.Canvas` bietet Vektorgrafik, da gibt es keine Punkte bzw. sind die "unendlich klein". Man muss also noch angeben welche Ausmasse ein Punkt hat. Und da währen wir dann bei Quadraten oder Kreisen.

Verfasst: Samstag 27. Oktober 2007, 12:04
von gurke111
akzeptiert. Dann ist das so blöd ja gar nicht.

Also, wie schauts aus mit der Geschwindigkeit? Kann da jemand was zu sagen oder erübrigt sich diese Frage mit einem "boah, was will der denn?" :)

Verfasst: Samstag 27. Oktober 2007, 14:22
von schlangenbeschwörer
Also es kommt schon drauf an, was du willst.
Meisten ist Geschwindigkeit nicht so ein großes Problem, wenn du natürlich jede Sekunde 1.000.000 Punkte oder so erneuern willst, kanns schon etwas langsamer werden :wink:
Vor allem musst du das, was du nicht mehr brauchst, löschen und nicht übermalen!
BlackJack hat geschrieben:`Tkinter.Canvas` bietet Vektorgrafik, da gibt es keine Punkte bzw. sind die "unendlich klein". Man muss also noch angeben welche Ausmasse ein Punkt hat. Und da währen wir dann bei Quadraten oder Kreisen.
Es soll Leute geben, die machen das so:

Code: Alles auswählen

canvas.create_text(50,50, text = ".")
:lol:

Verfasst: Samstag 27. Oktober 2007, 18:57
von BlackJack
Da kommt es dann aber sehr darauf an wo dieser Punkt *wirklich* gesetzt wird. Und wenn man mit Linien ein Raster und Achsenbeschriftung erstellt hat, möchte man normalerweise nicht, dass die Messpunkte alle etwas tiefer und einen Tick nach rechts verschoben sind. ;-)

Verfasst: Sonntag 28. Oktober 2007, 07:10
von schlangenbeschwörer
Darum ist das ja auch ein Level schwieriger :wink:
Wer nicht rechnen möchte, kann ja auch die Linien mit "_" und "|" darstellen. :D
Aber da brauch man dann eig. auch kein Tkinter mehr :D

Verfasst: Sonntag 28. Oktober 2007, 11:05
von gurke111
Dass die pythonw.exe unter Windows nach ein bisschen (!) malen schon 45 MB Speicher für sich beansprucht ist normal? Also das ist sozusagen der Grundstock. Wenn ich dann viel viel mehr Punkte zeichne (sagen wir mal 200000), gehts hoch bis ~ 65 MB. Der Zuwachs geht ja dann in Ordnung vom Gefühl her. Aber dass das schon soviel ist, wenn ich fast noch nichts gemacht hab.. hm. Liegt hoffentlich einfach am Canvas und nicht an Tkinter ansich.

Ich habe im Moment so eine Methode drin zum Programm beenden per "X":

Code: Alles auswählen

    self.master.protocol('WM_DELETE_WINDOW', self.onQuit) 
  def onQuit(self):
    sys.exit()
Habe fürs rechnen und zeichnen nen eigenen Thread. Das ganze Programm dann mit sys.exit() zu beenden ist nicht wirklich sauber oder? Ich komme darauf, weil dann beim Beenden manchmal noch ne Fehlerausgabe eines Threads kommt.

Verfasst: Sonntag 28. Oktober 2007, 11:29
von BlackJack
Zu Canvas-Objekten muss man vielleicht noch sagen, dass es wirklich Objekte sind. Da wird nicht einfach ein Kreis oder ein Rechteck gezeichnet, also in Pixelgrafik umgewandelt und das war's, sondern jedes Element ist ein Objekt, das man noch nachträglich verändern kann (Farbe, Grösse, Position, etc.).

Verfasst: Sonntag 28. Oktober 2007, 12:00
von schlangenbeschwörer
Hi gurke111!
- Wie oben bereits gesagt, ist ab einer bestimmten Punktanzahl PIL besser geeignet, vor allem wenn du nicht jedes Zwischenbild zeigen möchtest, sondern mit einem Schlag 200000 Punkte malst.
-Tkinter +Thread = vermutlich Probleme. Versuche wenn möglich Threads durch die after-Methode zu ersetzen.
-Zum Beenden findest du hier ne Menge Beiträge, nur ein paar Tips:
Tkinter mainloop beenden mit quit
Tkinter Tk mit destroy zerstören
fertig (kein sys.exit)