Seite 1 von 1

Diagramm zeichnen und richtig skalieren zur Fenstergröße

Verfasst: 31. Mai 2008 13:03
von qt2007
Hallo zusammen,
ich möchte ein Liniendiagramm darstellen. Die Werte liegen als QVector<char> vor. Auf dem Bildschirm sollen jeweils immer 1024 Werte aus diesem Vector dargestellt werden unabhängig von der Größe des Fensters in Pixel. Später soll es noch weitere Zoom Stufen geben, so dass z.B. auch 4096 Werte oder mehr dargestellt werden können. Jetzt gibt es folgendes Problem (siehe Bilder). Hat das Fenster mehr Pixel als Werte die momentan gargestellt werden sollen, kommt es natürlich zu Lücken. Ich habe versucht mit painter.scale(width() / 1024.0, 1.0) die Breite auf 1024 Werte aufzuteilen und dann mit pen->setWidthF(width() / 1024.0) die Linien zu zeichnen. Das funktioniert aber auch nicht richtig und ist außerdem sehr sehr langsam. Nun meine Frage: gibt es vielleicht eine elegante Methode wie ich diese Lücken verhindern kann?

Verfasst: 31. Mai 2008 13:28
von upsala
Zeichne nicht jeden Punkt von 0 weg, sondern packe alle Punkte in ein Polygon.

Verfasst: 31. Mai 2008 18:06
von qt2007
Danke, funktioniert astrein!
Gruß

Verfasst: 1. Juni 2008 15:29
von qt2007
Wie ich schon erwähnt habe funktioniert es einwandfrei. Wenn aber zu sehr vergrößert wird geht der Liniencharakter verloren, die einzelnen Balken sind dann nicht mehr erkennbar. Jetzt habe ich folgende Lösung gefunden: wenn ich vor dem skalieren von QPainter einen Pen definiere mit Linienstärke 1, so wird diese Linienstärke dann später auch mitskaliert, genau so wie ich es gern haben würde. Einziges Problem ist die CPU Auslastung, man muss dazu sagen, dass das Diagramm 25 mal in der Sekunde per Timer geupdatet wird. Die Auslastung liegt mit dem skalierten Pen dann bei über 50%, ohne diesen bei max. 5%.
Gibt es vielleicht doch noch Alternativen, die den Liniencharakter erhalten oder muss ich damit leben?

Verfasst: 1. Juni 2008 15:49
von qt2007
Sorry es funktioniert auch mit der Polygonmethode wie oben beschrieben. Ich musste nur bei jeder Linie daneben auf gleicher Höhe noch einen Punkt setzen, dann bekommt man auch Balken und keine Spitzen. Das ich da nicht gleich graufgekommen bin... Nochmals Danke an upsala!
Gruß