pyFmGraph (Artistic Last.fm Statistic)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Würde es nicht reichen wenn du einfach die Stützpunkte addierst?
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Ne, weil die eben nicht übereinander liegen. Was ich machen müsste wäre es Bezierkurven in mehrere kleine Bezierkurven zu unterteilen. Und da hab ich mathematische Probleme. Ne Alternative wäre die Bezierkurven in Polygonzüge mit regelmäßigen x-Abständen zu unterteilen. Ich hab das mal in Maple Versucht und das Ergebniss war ziemlich wüst. Hier mal ne Zeichnung zum Problem:

http://homepages.uni-regensburg.de/~hua16585/bezier.svg
- http://bash.org/?400459
lunar

Mein erster Versuch. Das git repo ist hier zu finden.

Die Ausgabe meines Codes sagt mir, dass da noch etwas nicht stimmt. Was, kann ich nicht sagen, der Code zum Zeichnen ist größtenteils 1:1 kopiert und notdürftig in das OOP Korsett gezwängt, da ich ihn immer noch nicht wirklich verstehe. Irgendwo habe ich da wohl was bei der Anpassung übersehen. Morgen werde ich vielleicht nochmal ein bisschen damit spielen, für Tipps wäre ich aber echt dankbar. Ansonsten gibts die fertige Version höchstwahrscheinlich erst nächstes Wochende (wenn überhaupt).

Eine Frage an den OP hätte ich allerdings schon mal: Du programmierst nicht lange in Python, oder? Im Code fallen viele Dinge auf, die gelinde gesagt ziemlich mies sind. Die dauernde Verwendung von range zur aufsteigenden Iteration über Zahlen wäre ja noch zu verschmerzen, aber sowas

Code: Alles auswählen

for nvec in range(len(curve))[1:-1]:
    ...
ist ja grausam :shock: Das tut ja fast schon körperlich weg...
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Sieht ja echt ganz schick aus mit OOP. Ich hab schon vor einiger Zeit mit Python angefangen, nur hab ich bisher hauptsächlich mit der Python Referenz beschäftigt und mir fehlt halt das know-How z.B. mit der Iterierung.

Zum Zeichencode, das funktioniert so:

(ich hab mal ein Bild gemalt: http://homepages.uni-regensburg.de/~hua16585/graph.svg
)

Als erstes holt er die Daten von Audioscrobbler und konvertiert sie in Vektoren. Diese sind in relativ regelmäßigen Abständen sofern Daten vorhanden waren. Damit Man eine annähernde Kurve bekommt werden jetzt an stellen wo keine Daten vorhanden sind Vektoren mit y-Wert 0 eingefügt (rot). Aber so, dass nicht mehr als zwei Null-Vektoren aufeinander folgen. Der nächste Schritt ist dann Voraussetzung zum zeichnen der Bezier-Kurven. Es werden Linear-Interpolierte Stützvektoren eingezeichnet (blau) an diesen liegen die Bezierkurven später dann tangential an. Jetzt werden Bezierkurven verwendet um Vektoren die die Bezierkurve annähern zu berechnen. Die Auflösung hierfür ist variabel, je grober, desto eckiger werden die Kurven später. Eine gute Erklärung von Bezierkurven findest du hier: http://www.gamedev.net/reference/articl ... le1808.asp

Jetzt besteht jede Kurve aus vielen Vektoren die eine einigermaßen rund sind. Also muss man das ganze nur noch übereinander stapeln.

Dazu werden zwischen den zwei nächstliegenden Vektoren die Pixelpositionen linear interpoliert. (Also Mittels Steigungsdreieck und zentrischer Streckung) Die Y-Werte werden dann einfach addiert.

Jetzt verstehst du sicher auch, warum es schwierig ist das ganze als svg zu exportieren. Die Bezier-Funktion muss nämlich zum übereinander stapeln explizit ausgeführt werden.

Was ich mir vorstellen könnte wäre höchstens, dass es eine Methode gibt eine Bezier kurve in mehrere zu zerlegen, so dass alle die gleiche X-Länge haben. Dann könnte man vielleicht einfach die Stützpunkte addieren.

Hoffe mal die Erklärung war verständlicher als der Code ;)
- http://bash.org/?400459
lunar

Tja, die Erklärung sagt mir nur bedingt was, dafür reichen meine mathematischen Kenntnisse momentan nicht aus (die Oberstufe ist ne Weile her, das Studium beginnt erst nächstes Jahr, da vergisst man einiges ;) ).

Allerdings habe ich den Bug gefunden, jetzt zeichnet meine Version ihre Graphen ebenfalls korrekt. Die neue Version liegt im Repo, für git-Verweigerer gibts auch noch das Paste. Nächstes Wochenende kann ich mal versuchen, den Text direkt in das Bild zu integrieren. Mittels image.paste sollte das kein allzu großes Problem sein, nur die Platzierung der Text müsste noch optimiert werden. Dabei hoffe ich mal auf deine Hilfe ;)

Das Kommandozeilen-Interface ist auch noch verbesserungsbedürftig, es fehlen Optionen, um z.B. die verwendete Schriftart anzugeben, oder die Verbosity des Loggings.
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Für die Schriftpositionierung hätte ich schon ne Idee, allerdings muss ich sehen wann ich dafür zeit habe. Das Physikstudium ist zur Zeit recht arbeitsintensiv.
- http://bash.org/?400459
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Hi, ich hab mal angefangen bischen dran rum zu spielen und der optionparser code scheint etwas buggy zu sein. Beispielsweise löst die dump Option einen Fehler aus.
- http://bash.org/?400459
lunar

Nichts anderes habe ich erwartet, siehe den letzten Abschnitt meines letzten Postings ;)

Ich habe den Parsing Code gefixt. Die neue Version liegt sowohl im Repo als auch im LodgeIt. Morgen kümmere ich mich um die Optionen fürs Logging und für die Schriftart... (jetzt hab ich kein Bock mehr ;) )
lunar

Der nächste Versuch:
  • Die Schriftart kann jetzt angegeben werden.
  • Es gibt jetzt die üblichen Optionen zur Steuerung der Terminalausgabe (-v und -q)
  • Mittels -a kann der Text jetzt direkt in den Graphen integriert werden, was momentan allerdings ziemlich bescheiden aussieht.
  • Um den Text in eine separate Datei ausgeben, muss jetzt die --artists-file Option verwendet werden
  • psyco wird jetzt unterstützt, was zumindest bei meinen rudimentären Tests das Zeichnen des Graphen um fast die Hälfte beschleunigte.
Den Code gibts im Repo und im LodgeIt.
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Hi, ich hatte zwar immer noch keine Zeit weiter zu arbeiten, aber ich bin mitlerweile drauf gekommen, dass es wohl doch eine Möglichkeit gibt das ganze als svg auszugeben, was ja ziemlich cool wäre, weil es keine Pixelartefakte an den Rändern gäbe. Die Methode dazu nennt sich "Algorithmus von De Casteljau" mit dem man eine Bezierkurve in beliebig viele weitere unterteilen kann. Dannach muss man nur noch die Kontrollpunkte übereinander stapeln. Wenn du Lust hast etwas Vorarbeit zu leisten wäre das z.B. die nicht interpolierten Kurven als svg auszugeben (also die zackige Version).
- http://bash.org/?400459
Antworten