Vektoren zeichnen etc.

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.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ich merke gerade, dass mein Rechenskript mit Elektronen und Protonen vermischt schon gar nicht mehr funktioniert...

Das muss wohl eine weitere If-Abfrage rein...^^
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

colors
must be a sequence of RGBA tuples (eg arbitrary color strings, etc, not allowed).
Habe es nun gefunden.

Danke!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

SchneiderWeisse hat geschrieben:Habe es nun gefunden.
Danke!
Danke fürs Mitteilen! ;)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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...
Antworten