2009-02-03 18 views
7

Ho serie di dati di grandi dimensioni (dati a 10 Hz, quindi 864 k punti per 24 ore) che ho bisogno di tracciare in tempo reale. L'idea è che l'utente può ingrandire e fare una panoramica in grafici di dispersione altamente dettagliati.Come tracciare i vettori di dati di grandi dimensioni in modo accurato a tutti i livelli di zoom in tempo reale?

I dati non sono molto continui e ci sono picchi. Poiché il set di dati è così grande, non riesco a tracciare ogni punto ogni volta che la trama viene aggiornata.

Ma non riesco nemmeno a tracciare ogni n ° punto altrimenti mi mancheranno caratteristiche importanti come picchi grandi ma corti.

Matlab ha ragione. Puoi dargli un vettore di 864k pieno di zeri e basta impostare un punto su 1 e verrà tracciato correttamente in tempo reale con zoom e panoramiche.

Come funziona Matlab?

Il mio sistema di destinazione è Java, quindi vorrei generare viste di questo grafico in Swing/Java2D.

+0

Non capisco davvero cosa stai chiedendo qui. Potresti aggiungere un esempio di codice di come stai tracciando i dati in MATLAB? – gnovice

+0

La tua domanda è una domanda Java o una domanda Matlab? –

+0

Mi chiedo come funziona Matlab, quindi lo riproduco in Java – Pyrolistical

risposta

4

Si dovrebbe cercare il file da MATLAB Central:

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

Dall'autore:

Questa versione di "complotto" vi permetterà di visualizzare i dati che ha un numero molto grande di elementi. Il tracciamento di un set di dati di grandi dimensioni rende lenta la tua grafica, ma la maggior parte delle volte non hai bisogno di tutte le informazioni visualizzate nella trama. Lo schermo ha solo tanti pixel e i tuoi occhi non saranno in grado di rilevare alcuna informazione non catturata sullo schermo.

Questa funzione esegue il downsampling dei dati e traccia solo un sottoinsieme di dati, migliorando così il requisito di memoria. Quando il grafico viene ingrandito, vengono visualizzate ulteriori informazioni. Qualche lavoro è fatto per assicurarsi che i valori anomali vengano catturati.

Sintassi:

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

Esempio:

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

Non so come Matlab lo fa, ma mi piacerebbe iniziare con Quadtrees.

Scarica tutti i tuoi punti dati nel quadrilatero, quindi per eseguire il rendering a un determinato livello di zoom, percorri il quadrilatero (iniziando dalle aree che si sovrappongono a ciò che stai visualizzando) fino a raggiungere aree comparabili alle dimensioni di un pixel. Attacca un pixel nel mezzo di quell'area.

aggiunto: Anche il disegno con OpenGL/JOGL consente di ottenere un disegno più veloce. Soprattutto se è possibile prevedere il panning e creare i punti da mostrare in un elenco di visualizzazione o qualcosa del genere, in modo da non dover eseguire alcun lavoro CPU per i nuovi fotogrammi.

0

10Hz dati significa che è necessario tracciare solo 10 fotogrammi al secondo. Dovrebbe essere facile, dal momento che molti giochi raggiungono> 100 fps con una grafica molto più complessa.

Se si tracciano 10 pixel al secondo per ogni punto di dati possibile, è possibile visualizzare un minuto di dati utilizzando un widget di 600 pixel di larghezza. Se si salva l'indice del 600 ° all'ultimo campione, dovrebbe essere facile disegnare solo i dati più recenti.

Se non si dispone di un nuovo punto di dati ogni 10 ° di secondo si deve venire con un modo per inserire un punto di dati interpolati. Vengono in mente tre scelte:

  1. Ripetere l'ultimo punto di dati.
  2. inserire un punto dati "vuoto". Ciò causerà lacune nel grafico.
  3. Non aggiornare il grafico fino al prossimo punto di dati arrivano. Quindi inserisci tutti i pixel che non hai disegnato contemporaneamente, con interpolazione lineare tra i punti di dati.

Per rendere l'animazione scorrevole utilizzare double-buffering. Se la lingua di destinazione supporta un widget di tela, probabilmente supporta il doppio buffering.

Quando si esegue lo zoom si hanno le stesse tre scelte di cui sopra, poiché i punti di dati zoomati non sono continui anche se i punti di dati originali erano.

This potrebbe essere di aiuto per l'implementazione in Java.

+0

Spiacente, quando ho detto "tempo reale", intendevo che il tracciamento deve avvenire in tempo di lettura, ma i dati sono statici. – Pyrolistical