Seite 1 von 1

Vektoren zeichnen etc.

Verfasst: Dienstag 28. Oktober 2008, 19:16
von nemomuk
Hallo,

ich habe jetzt soweit den mathematischen/physikalischen Teil (vllt. geht das alles leichter - habe mir das aber alles selbst zusammengerechnet, was nicht heißt, dass es der kürzeste und performanteste Weg ist^^) meines Programms fertig, welches die elektrische Feldstärke in einem Raum zu jedem beliebigen Punkt mit beliebig vielen Ladungen bestimmt.
http://paste.pocoo.org/show/89333/
Hierzu brechne ich Winkel plus Stärke des Vektors zur x-Achse.
Nun will ich das alles unter einer grafische Oberfläche verpacken. Mit Darstellung der Vektoren plus Platzierung der Ladungen im Raum...

Was bietet sich hierzu an?

Danke!

Verfasst: Dienstag 28. Oktober 2008, 19:32
von BlackJack
Ich würde spontan sagen: `Tkinter`. Ist in der Standardbibliothek und `Tkinter.Canvas` ist Vektorgraphik.

Nachtrag: Du hast das Programm aber nicht, ausprobiert, oder? Ich bekomme einen `AttributeError: type object 'Konstanten' has no attribute 'pi'`.

Wenn ich das behebe, dann gibt's einen `ZeroDivisionError: float division` in Zeile 59.

Warum ist `feldstärke()` keine Methode des `Raum`\s? Es benötigt und verändert den Zustand des Raums ganz offensichtlich.

Verfasst: Dienstag 28. Oktober 2008, 20:56
von nemomuk
http://paste.pocoo.org/show/89343/

da hatte ich wohl eine alte Version "gepastet"...

Jetzt sollte es funktionieren.

Mit wxPython ist das auch möglich?

Danke für deine Hilfe!

Verfasst: Dienstag 28. Oktober 2008, 22:18
von BlackJack
Hast Du eigentlich mal auf die Laufzeit geachtet? Bei mir 17 Sekunden. Wenn man in Zeile 42 den Aufruf von `.keys()` entfernt und damit das Erzeugen der völlig unnötigen 19600 Listen verhindert, ist die hässliche quadratische Laufzeit weg und das Skript ist 34x schneller, also schon in einer halben Sekunde fertig.

Nachtrag: Öhm, es wird nur das Feld für den ersten Eintrag in `self.ladungen` gespeichert. Im ``if``-Zweig ab Zeile 42 wird zwar einiges gerechnet, aber nichts irgend wo gespeichert.

Die Berechnung von `E_ladung` und `winkel_ladung` ist in beiden Zweigen identisch, kann also heraus gezogen werden.

Verfasst: Dienstag 28. Oktober 2008, 22:52
von gerold
SchneiderWeisse hat geschrieben:Mit wxPython ist das auch möglich?
Hallo!

Ich weiß ja nicht, wie du die Werte anzeigen möchtest. Aber wenn hier http://matplotlib.sourceforge.net/gallery.html ein Bild darunter ist das deinen Vorstellungen entspricht, dann ist Matplotlib vielleicht keine schlechte Wahl. Das kannst du auch ins wxPython integrieren.

Direkt im wxPython kannst du natürlich auch zeichnen. Dort hast du die Draw-Methoden der DCs http://docs.wxwidgets.org/stable/wx_wxdc.html oder des GraphicsContext http://docs.wxwidgets.org/stable/wx_wxg ... ntext.html zur Verfügung. Die wxPython-Demo macht dich diesbezüglich schlauer.

EDIT:

Wenn du im wxPython mit ``wx.GraphicsContext`` arbeitest, dann kannst du mit Pfaden arbeiten. Du kannst dir einen unsichtbaren ``GraphicsPath`` anlegen und später nachzeichnen lassen. Die Methode ``AddCurveToPoint`` http://docs.wxwidgets.org/stable/wx_wxg ... rvetopoint erlaubt das einfache Zeichnen von Bezierkurven -- falls du so etwas brauchen kannst.
Mehr kann ich dazu allerdings nicht schreiben, da ich noch nicht mit ``GraphicsPath`` gearbeitet habe.

mfg
Gerold
:-)

Verfasst: Mittwoch 29. Oktober 2008, 06:17
von nemomuk
danke euch beiden!

http://paste.pocoo.org/show/89381/

das mit den "keys()" ist ja wahnsinn - das dauert jetzt wirklich nur noch einen Bruchteil. Dass es nicht gespeichert wird, war mal wieder ein grober Fehler von mir.

Dann werde ich mich wohl mal mit Vektorzeichnung bei python beschäftigen müssen...

Vielen Dank für die Hilfe!

Verfasst: Mittwoch 29. Oktober 2008, 06:35
von nemomuk
ich merke gerade, dass mein Rechenskript mit Elektronen und Protonen vermischt schon gar nicht mehr funktioniert...

Das muss wohl eine weitere If-Abfrage rein...^^

Verfasst: Mittwoch 29. Oktober 2008, 18:18
von gerold
Da ich jetzt langsam denke, dass du einfach nur Punkte in einen 3D-Raum zeichnen möchtest, dürfte GnuPlot besser geeignet sein als Matplot.

http://www.python-forum.de/topic-11529. ... ht=gnuplot

.

Verfasst: Mittwoch 29. Oktober 2008, 20:42
von nemomuk
Danke für die Vorschläge...

Nun habe ich mir überlegt: Was wäre denn für ein Modul passend, wenn ich die Teilchen praktisch "Real-Time" verschieben können will und sofort das Ergebnis grafisch darstelle?

### Es soll aber vorerst immer noch in 2D bleiben

Danke!

Verfasst: Donnerstag 30. Oktober 2008, 20:15
von nemomuk
http://paste.pocoo.org/show/89584/

So nun bin ich soweit fertig und es funktioniert auch schon, wenn auch das Ergebnis noch nicht besonders "berauschend" aussieht.

Nun wollte ich fragen, wie man mit matplotlib andere Farbwerte für die Vektoren setzen kann - außer die Standardfarben wie 'r', 'b' etc. Ich konnte leider keine andere Methode finden.

Ich wollte nämlich statt der Zeichnung der Vektoren "In die Länge", verschiedene Farbwerte je nach Feldtstärke verwenden und diese mit einer Funktion berechnen (möglichst stufenloser Farbübergang).

Danke!

Verfasst: Donnerstag 30. Oktober 2008, 21:09
von gerold
SchneiderWeisse hat geschrieben:andere Farbwerte
Hallo!

An ``pyplot.quiver`` http://matplotlib.sourceforge.net/api/p ... lot.quiver kann man ein Array/Liste mit Farbwerten übergeben. Nur habe ich noch nicht herausgefunden, welcher Art die Farbdaten sein müssen.

Zufallsfarben: http://paste.pocoo.org/show/89591/

lg
Gerold
:-)

Verfasst: Donnerstag 30. Oktober 2008, 21:26
von ichbinsisyphos
Weils hier zu passen scheint: Hat schon jemand die rgb-tuple Methode bei matplotlib zum laufen gebracht? Angeblich sollte man da Farben in der Form (1.,1.,1.) übergeben können, jeweils eine Zahl für Rot-, Grün-, Blau-Kanal zwischen 0 und 1.

Ist in der pydoc-Hilfe (spärlich) dokumentiert, alle meine Versuche sind bisher aber gescheitert.

Die Hex-Methode mit

Code: Alles auswählen

markerfacecolor="#ffffff", markeredgecolor="#ffffff"
funkt aber sicher, wenn dem OP damit geholfen ist.

Verfasst: Freitag 31. Oktober 2008, 16:01
von nemomuk
colors
must be a sequence of RGBA tuples (eg arbitrary color strings, etc, not allowed).
Habe es nun gefunden.

Danke!

Verfasst: Freitag 31. Oktober 2008, 16:22
von mkesper
SchneiderWeisse hat geschrieben:Habe es nun gefunden.
Danke!
Danke fürs Mitteilen! ;)

Verfasst: Freitag 31. Oktober 2008, 16:54
von nemomuk
Leider funktioniert es aber nicht...

Wenn ich mit folgendem Code ein Farbentupel erstelle:

Code: Alles auswählen

for i in range(n):
     color_list.append((255,255,255,0))
pylab.quiver(punkt_x_list, punkt_y_list, E_x_list, E_y_list, color_list)
Auch mit Angabe der RGB Werte als Float, funktioniert es nicht... komisch...

Da nimmt er anscheinend immer blau, obwohl es ja weiß sein müsste...