Seite 1 von 2

Verfasst: Montag 12. November 2007, 08:14
von veers
Würde es nicht reichen wenn du einfach die Stützpunkte addierst?

Verfasst: Montag 12. November 2007, 11:10
von sonium
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

Verfasst: Samstag 17. November 2007, 23:38
von 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...

Verfasst: Sonntag 18. November 2007, 14:22
von sonium
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 ;)

Verfasst: Sonntag 18. November 2007, 18:45
von 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.

Verfasst: Sonntag 18. November 2007, 21:58
von sonium
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.

Verfasst: Dienstag 20. November 2007, 23:47
von sonium
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.

Verfasst: Freitag 23. November 2007, 19:38
von 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 ;) )

Verfasst: Samstag 24. November 2007, 16:02
von 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.

Verfasst: Samstag 24. November 2007, 18:07
von sonium
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).