Comment tracer les grands vecteurs de données avec précision à tous les niveaux de zoom en temps réel?

StackOverflow https://stackoverflow.com/questions/508666

Question

J'ai de grands ensembles de données (données de 10 Hz, donc 864k points par 24 heures) que je dois tracer en temps réel. L'idée est que l'utilisateur peut zoomer et pan dans des diagrammes de dispersion très détaillées.

Les données ne sont pas très continue et il y a des pointes. Étant donné que l'ensemble de données est si grand, je ne peux pas tracer chaque point à chaque fois que le tracé rafraichit.

Mais je ne peux pas non seulement tracer chaque nième point ou je vais manquer principales caractéristiques comme grandes, mais de courtes pointes.

Matlab fait juste. Vous pouvez lui donner un vecteur 864k pleine de zéros et vient de mettre un point quelconque à 1 et il tracera correctement en temps réel avec zooms et des panoramiques.

Comment Matlab faire?

Mon système cible est Java, donc je serais générer des vues de ce complot dans Swing / Java2D.

Était-ce utile?

La solution

Vous devriez essayer le fichier de Central Matlab:

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

De l'auteur:

Cette version de « complot » vous permettra de visualiser des données qui a très grand nombre d'éléments. Traçage grand ensemble de données rend vos graphiques atone, mais la plupart du temps vous n'avez pas besoin de tous les informations affichées dans l'intrigue. Votre écran ne dispose que tant de pixels, et vos yeux ne sera pas en mesure de détecter toute information non capturée sur l'écran.

Cette fonction downsample les données et tracer un sous-ensemble des données, améliorant ainsi l'exigence de mémoire. Lorsque le terrain est zoomée, plus d'informations s'affiche. Des travaux sont en fait pour faire en sorte que les valeurs aberrantes sont capturés.

Syntaxe:

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

Exemple:

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);

Autres conseils

Je ne sais pas comment Matlab fait, mais je commence par Quadtrees .

Vidage de tous vos points de données dans le quadtree, puis de rendre à un niveau de zoom donné, vous marchez dans la quadtree (en commençant par les zones qui se chevauchent ce que vous visionnez) jusqu'à ce que vous atteigniez les zones qui sont comparables à la taille un pixel. Coller un pixel dans le milieu de cette zone.

ajouté: Faire votre dessin avec OpenGL / JOGL également vous aider à obtenir le dessin plus rapide. Surtout si vous pouvez prédire le panoramique, et de construire les points à afficher dans une liste d'affichage ou quelque chose, de sorte que vous ne devez pas faire un travail de CPU pour les nouvelles images.

données de 10Hz signifie que vous suffit de tracer 10 images par seconde. Il devrait être facile, puisque de nombreux jeux à atteindre> 100 fps avec des graphismes beaucoup plus complexes.

Si vous tracez 10 pixels par seconde pour chaque donnée possible point, vous pouvez afficher une valeur de minutes de données à l'aide d'un widget large de 600 pixels. Si vous enregistrez l'index de la 600e à dernier échantillon, il devrait être facile de tirer uniquement les dernières données.

Si vous ne disposez pas d'un nouveau point de données chaque 10e de seconde, vous devez venir avec un moyen d'insérer un interpolée point de données. Trois choix viennent à l'esprit:

  1. Répéter le dernier point de données.
  2. Insérez un « vide » point de données. Cela entraînera des lacunes dans le graphique.
  3. Ne pas mettre à jour le graphique jusqu'à ce que le prochain point de données arrive. Ensuite, insérez tous les pixels vous ne pas tirer à la fois, avec une interpolation linéaire entre les points de données.

Pour l'utilisation en douceur d'animation double mise en mémoire tampon . Si votre langue cible prend en charge un widget toile supporte probablement le double tampon.

Lors d'un zoom, vous avez les mêmes trois choix comme ci-dessus, les points de données zoomée ne sont même pas en continu si les originaux points de données ont été.

Cette pourrait aider à la mise en œuvre en Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top