Come per tracciare grandi vettori di dati con precisione a tutti i livelli di zoom in tempo reale?

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

Domanda

Non ho set di dati di grandi dimensioni (dati 10 Hz, in modo da 864K punti per 24 ore), che ho bisogno di tracciare in tempo reale. L'idea è che l'utente può zoom e pan in lotti molto dettagliate a dispersione.

Il dato non è molto continuo e ci sono punte. Dal momento che l'insieme di dati è così grande, non riesco a tracciare ogni punto ogni volta che la trama viene aggiornata.

Ma ho anche possibile non solo tracciare ogni punto ennesima altrimenti mi mancherà caratteristiche principali come le grandi, ma brevi picchi.

Matlab fa proprio. Si può dare un 864K vettore piena di zeri e solo impostare qualsiasi un punto ad 1 e sarà stampato in modo corretto in tempo reale con zoom e panoramica.

Come Matlab fare?

Il mio sistema di destinazione è Java, quindi vorrei essere la generazione di vista di questa trama in Swing / Java2D.

È stato utile?

Soluzione

Si dovrebbe cercare il file da MATLAB Central:

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

Da parte dell'autore:

Questa versione di "complotto" vi permetterà di visualizzare i dati che ha gran numero di elementi. Tracciare grande insieme di dati rende la grafica lenta, ma il più delle volte non è necessario tutte le informazioni visualizzate nella trama. Lo schermo ha solo tanti pixel, ei tuoi occhi non sarà in grado di rilevare qualsiasi informazione non catturate sullo schermo.

Questa funzione downsample i dati e la trama solo un sottoinsieme dei dati, migliorando così i requisiti di memoria. Quando la trama è ingrandita, viene visualizzata ulteriori informazioni. Qualche lavoro è fatto per assicurarsi che i valori anomali vengono catturati.

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

Altri suggerimenti

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

Dump tutti i punti di dati nella quadtree, quindi per rendere ad un dato livello di zoom, si cammina lungo la quadtree (a partire dalle aree che si sovrappongono ciò che si sta visualizzando) fino a raggiungere le zone che sono paragonabili alle dimensioni del un pixel. Bastone un pixel nel bel mezzo di quella zona.

aggiunto: Fare il disegno con OpenGL / JOGL aiuterà anche a ottenere disegno più veloce. Soprattutto se è possibile prevedere panning, e costruire i punti di mostrare in un elenco di visualizzazione o qualcosa, in modo che non c'è bisogno di fare qualsiasi lavoro della CPU per i nuovi fotogrammi.

Dati 10Hz significa che hai solo per tracciare 10 fotogrammi al secondo. Dovrebbe essere facile, dal momento che molti giochi di raggiungere> 100 fps con una grafica molto più complesso.

Se si traccia 10 pixel al secondo per ogni possibile punto di dati è possibile visualizzare un minuto vale la pena di dati utilizzando un widget 600 pixel di larghezza. Se si salva l'indice del 600 ° per ultimo campione dovrebbe essere facile da disegnare solo gli ultimi dati.

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. Tre scelte vengono in mente:

  1. Ripeti l'ultimo punto dati.
  2. Inserisci un-punto dati "vuoto". Questo farà sì che le lacune nel grafico.
  3. Non aggiornare il grafico fino al prossimo punto di dati arrivano. Quindi inserire tutti i pixel non ha tratto in una sola volta, con interpolazione lineare tra i punti di dati.

Per rendere l'animazione uso liscia doppio buffering . Se la lingua di destinazione supporta un widget tela probabilmente supporta doppio buffering.

Quando si ingrandisce si hanno le stesse tre opzioni di cui sopra, come le ingrandite punti di dati non sono continui, anche se i punti di dati originali erano.

Questo potrebbe aiutare per la sua attuazione in Java.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top