Frage

Ich habe große Datensätze (10 Hz Daten, so 864k Punkte pro 24 Stunden), die ich in Echtzeit planen muß. Die Idee ist, kann der Benutzer in sehr detaillierte Streudiagramme zoomen und schwenken.

Die Daten sind nicht sehr kontinuierlich und es gibt Spikes. Da die Datenmenge so groß ist, kann ich nicht jedem Punkt jedes Mal zeichnen die Handlung aktualisiert wird.

Aber ich kann auch nicht nur jeden n-ten Punkt plotten oder ich wichtige Funktionen wie große, aber kurze Spitzen entgehen lassen.

Matlab macht es richtig. Sie können ihm voll von Nullen eine 864k Vektor geben und stellt nur einen beliebigen Punkt auf 1, und es wird mit Zooms und Schwenk korrekt in Echtzeit darzustellen.

Wie Matlab es tun?

Ihr Zielsystem ist Java, also würde ich Aussicht auf diesem Grundstück in Swing werden Erzeugen / Java2D.

War es hilfreich?

Lösung

Sie sollten die Datei von MATLAB Central versuchen:

https://mathworks.com/matlabcentral/fileexchange/15850-dsplot -downsampled-plot

Vom Autor:

Diese Version von „Handlung“ ermöglicht es Ihnen, Daten zu visualisieren, die sehr große Anzahl von Elementen haben. großer Datensatz Plotten macht Ihre Grafiken träge, aber die meiste Zeit Sie in der Handlung angezeigt alle Informationen nicht benötigen. Ihr Bildschirm hat nur so viele Pixel, und die Augen nicht in der Lage, alle Informationen auf dem Bildschirm nicht erfaßt zu erkennen.

Mit dieser Funktion wird die Daten und die Handlung nur eine Teilmenge der Daten heruntergerechnet, wodurch den Speicherbedarf zu verbessern. Wenn die Handlung wird gezoomt, werden weitere Informationen angezeigt. Einige Arbeit ist getan, um sicherzustellen, dass Ausreißer erfasst werden.

Syntax:

dsplot(x, y)  
dsplot(y)  
dsplot(x, y, numpoints)  

Beispiel:

x =linspace(0, 2*pi, 1000000);  
y1=sin(x)+.02*cos(200*x)+0.001*sin(2000*x)+0.0001*cos(20000*x);  
dsplot(x,y1);

Andere Tipps

Ich weiß nicht, wie Matlab es tut, aber ich würde beginnen mit Quadtrees .

Dump alle Datenpunkte in die Quadtree, dann bei einer bestimmten Zoomstufe zu machen, Sie zu Fuß den Quadtree nach unten (mit den Bereichen beginnen, die sie überlappen, was Sie sehen), bis Sie Bereiche zu erreichen, die die Größe vergleichbar sind ein Pixel. Halten Sie ein Pixel in der Mitte dieses Bereichs.

hinzugefügt: Handeln Sie Ihre Zeichnung mit OpenGL / JOGL werden Sie auch schnelle Zeichnung erhalten helfen. Vor allem, wenn man kann Panning vorhersagen, und baut die Punkte nach oben in einer Anzeigeliste oder etwas zu zeigen, so dass Sie keine CPU-Arbeit für den neuen Rahmen zu tun haben.

10Hz Daten bedeuten, dass Sie nur 10 Bilder pro Sekunde zu zeichnen haben. Es sollte einfach sein, da viele Spiele erreichen> 100 fps mit vielen komplexen Grafiken.

Wenn Sie 10 Pixel plotten pro Sekunde für jede möglichen Daten zeigen Sie eine Minute im Wert von Daten anzeigen können einen 600 Pixel breiten Widget verwenden. Wenn Sie den Index des 600. speichern Probe dauern sollte es einfach sein, nur die neuesten Daten zu ziehen.

Wenn Sie nicht über einen neuen Datenpunkt jeden 10. ein zweit Sie eine Möglichkeit zu kommen haben einen interpolierten Datenpunkt einzufügen. Drei Möglichkeiten in den Sinn kommen:

  1. Wiederholen Sie den letzten Datenpunkt.
  2. Legen Sie einen „leeren“ Datenpunkt. Dies führt dazu, Lücken in der Grafik.
  3. Sie das Diagramm nicht aktualisiert werden, bis der nächste Datenpunkt ankommt. Legen Sie dann alle Pixel, die Sie nicht sofort zeichnen, mit linearer Interpolation zwischen den Datenpunkten.

Um die Animation glatt Verwendung Double-Buffering zu machen. Wenn Ihre Zielsprache einen Leinwand-Widget unterstützt wahrscheinlich unterstützt Double-Buffering.

Beim Zoomen Sie die gleichen drei Möglichkeiten, wie oben haben, da die gezoomt Datenpunkte nicht kontinuierlich sind, selbst wenn die ursprünglichen Daten-Punkte waren.

Diese es für die Implementierung in Java helfen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top