[c++] Diagramma cartesiano con librerie SDL

valentino861
Mi sto studiando le librerie SDL per poter fare un diagramma cartesiano aggiornato in real time. Praticamente ho il programma che acquisisce dei dati e li dovrei diagrammare.
Qualche idea su come fare? Qualche link su cosa dovrei studiare in particolare?
Ho visto solo come poter muovere un'immagine con i tasti della tastiera.

Grazie

Risposte
valentino861
Ok credo di aver deciso cosi.

Al programma faccio salvare i file in un file e poi me li leggo io esternamente da gnuplto mentre il programma gira. Il punto è che non vorrei neanche appesantire il programma per un aspetto visivo che non mi serve.

Quindi faccio partire il programma che memorizza i dati in un file e lavora per circa 8 ore di fila (un turno medio lavorativo), cosi ogni tanto per controllare apro gnuplot e gli faccio leggere il file dove il programma ha memorizzato i valori, e vedo il grafico.
Poi sempre se su gnuplot riuscissi a fare un ""quasi"" aggiornamento dei dati sarebbe ottimo.

Scusate se sto cambiando strada ogni 10 minuti ma è un mondo che mi affascina moltissimo e quindi mi spingo da solo allo sbaraglio perdendo di vista il vero obiettivo del mio progetto.

Ora però devo pensare bene come memorizzare i dati nel file. Nel senso se memorizza 16384 valori ogni 5 minuti, dopo 9 ore il file scoppierà e se chiedo a gnuplot di plottare i dati penso mi ci mandi.

Per il loop dell'aggiornamento su gnuplot non posso fare cosi?:


gli dico di aprire un file .txt dove ci metto le istruzioni che deve compiere e glielo faccio caricare (load). Nel txt gli dico di plottare i dati contenuti nel file di output del programma e di fare un replot ogni tot secondi. L'ho fatto questa mattina ma si impallava dopo un pò...troppi dati?

valentino861

akiross1
"apatriarca":
Ma i grafici non si fanno usando le curve di Bézier... I punti di controllo di una curva di Bézier non si trovano sulla curva mentre i samples che valentino86 cattura lo sono.


Si, in effetti non ci avevo pensato... Anche se in realta' le curve di Bezier passano per il primo e l'ultimo punto, quindi si potrebbero usare comunque per i grafici ;) D'altronde Qt (come OpenGL se non erro) usano curve di questo tipo (e credo che siano in generale le piu' usate, anche SVG mi pare usi curve di Bezier), quindi non so se le alternative sono piu' appetibili...

Onestamente non ho mai disegnato grafici che andassero oltre pochi punti e poche linee :D Quindi non ho davvero esperienza. Se dici che si usano i Catmull-Rom, mi fido!

valentino86, ehehe ti capisco :D Anche io a volte mi faccio prendere la mano ad esplorare!
Per la memorizzazione nel file, forse esagero, ma ti consiglio di fare un pensierino sui dati binari. Non so se gnuplot lo supporta, ma se si potesse fare saresti a cavallo: sarebbe mooolto piu' conveniente in fatto di spazio e formati.
Sul lavoro di aggiornamento che hai fatto onestamente non saprei... Se parliamo di centinaia di migliaia di punti, forse il povero gnuplot non ce la fa :) Non so quale siano le sue capacita' in fatto di payload, ma mi sembra un lavoretto un po' arduo...

Visto che hai questa mole enorme di dati e devi tenere il tutto sotto controllo, non ti conviene (forse) fare delle medie dei dati? Ad esempio, anziche' 16k valori ogni 5 minuti, un solo valore medio ogni 5 minuti? O magari fare piu' file di dati, cosi' da dividere le quantita' di dati in modo piu' gestibile.

valentino861
a parte che non riesco a impostare set terminal gif, ma mi si impalla il grafico.

Praticamente faccio cosi gli faccio aprire uno script contenente:

set yrange [-3:3]
plot 'C:\Users\Valerio\Documents\Visual Studio 2005\Projects\unione\unione\dati.dat' with lines
pause 3
reread

e dovrebbe aggiornare il grafico ogni 3 secondi, e in parte lo fa, ma poi si impalla e se tocco il grafico si impalla sempre. Scusate il termine "impalla" praticamente si blocca e mi dice che l'applicazione non risponde. Sbaglio io??

akiross1
Valentino, scusa se ti aggiungo nuove possibilita' :D
Ma... Vista la tua mole di dati, sei SICURO che ti conviene usare un grafico nel senso classico? Non e' raro che molti dati vengano rappresentati come immagini 2D dove ogni pixel indica un valore nel tempo... Non so che dati tu debba controllare, ma tieni conto di questa opportunita': a volte e' una manna.

akiross1
"valentino86":
e dovrebbe aggiornare il grafico ogni 3 secondi, e in parte lo fa, ma poi si impalla e se tocco il grafico si impalla sempre. Scusate il termine "impalla" praticamente si blocca e mi dice che l'applicazione non risponde. Sbaglio io??


Ma ce la fa a caricare tutti quei dati ogni 3 secondi?? Con un intervallo di tempo maggiore si impalla comunque?

valentino861
ma non codice non faccio errori??

Ora provo ad allungare il tempo ma ho fatto delle prove con pochi valori, prendendo dati per soli 200 secondi.

Con immagini 2D...in che senso?

akiross1
Col codice non mi sembra, a giudicare dall'esempio che hai linkato... Fondamentalmente carica dei dati, aspetta un certo periodo e ricarica il file batch. La logica e' quella di un ciclo...

Nel senso che vedi una immagine con sfumature che ti mostrano l'andamento dei dati. Ad esempio, fai una immagine dove il nero equivale al tuo tetto minimo e il bianco al tetto massimo (cioe' i valori che assumono i tuoi dati). Guardando l'immagine tu vedi delle sfumature in scala di grigi, cosi' ti fai un'idea di come vanno i dati... Pero' dipende dal tipo di dati che rappresenti... Di solito si usano per rappresentare funzioni a 2 variabili.
Se tu usi un grafico x-y mi sa che non ti serve a molto :D Anche se - effettivamente - e' comunque un metodo veloce per tenere sott'occhio i dati in linea di massima... Ed essendo pixels puoi averne sott'occhio una quantita' notevole in poco spazio.

valentino861
per il problema con gnuplot pensavo non può essere che il problema sta nel reread? Cioè lui rilegge un file in continuo aggiornamento e quindi non statico.


Per il grafico con l'immagine si credo possa andare bene, devo fare un grafico xy del tempo e dell'accelerazione, ma è una cosa facile? Con gnuplot mi sembra vicina la soluzione

apatriarca
"akiross":
[quote="apatriarca"]Ma i grafici non si fanno usando le curve di Bézier... I punti di controllo di una curva di Bézier non si trovano sulla curva mentre i samples che valentino86 cattura lo sono.


Si, in effetti non ci avevo pensato... Anche se in realta' le curve di Bezier passano per il primo e l'ultimo punto, quindi si potrebbero usare comunque per i grafici ;) D'altronde Qt (come OpenGL se non erro) usano curve di questo tipo (e credo che siano in generale le piu' usate, anche SVG mi pare usi curve di Bezier), quindi non so se le alternative sono piu' appetibili...

Onestamente non ho mai disegnato grafici che andassero oltre pochi punti e poche linee :D Quindi non ho davvero esperienza. Se dici che si usano i Catmull-Rom, mi fido!
[/quote]
Sinceramente ho sempre visto usare linee spezzate. Le Catmull-Rom spline (un tipo particolare di spline cubiche di Hermite) permettono di disegnare una spline cubica che passa per una sequenza di punti. La derivata viene calcolata semplicemente in base alla posizione del punto precedente e quello successivo. È quindi più adatta ad essere usata in questo caso (almeno ad alto livello). Possono ovviamente essere convertite in curve di Bézier in fase di rendering.

@ valentino86: Lavorare con un file così grosso può essere complicato. Ti consiglio di dividere i dati in diversi file con la data e l'ora nel nome del file. In questo modo puoi muovere e studiare i file separatamente. Questo potrebbe anche essere un modo per risolvere il tuo problema dell'aggiornamento. Visualizzi un file per volta e poi passi al successivo...

EDIT: Usando un file binario non diventa neanche tanto grosso... ma ho comunque l'impressione che sia comunque meglio creare tanti file separati.

valentino861
si forse li separo, ma quando faccio l'analisi su tempi lunghi. Ora al massimo ho 2000 3000 valori....non mi sembrano moltissimi.

Cmq ho scoperto che sulla mia versione di gnuplot non funziona l'if, cioè non c'è proprio.

valentino861
ok stavo lavorando con la versione del '95 ecco perche si impallava :) Ora ho scaricato l'ultima di marzo 2009 e va che è una meraviglia.

Domani mattina la provo per bene ma direi che ci siamo

akiross1
Non e' il file di dati in continuo aggiornamento, ma il file dei comandi che carichi.

La guida dice che sostanzialmente ricarica il file che hai caricato con "load", creando un loop:
http://www.chemie.fu-berlin.de/chemnet/ ... ot_18.html

Sostanzilamente e' come se facessi:

load comandi
set range
plot dati
sleep
load comandi
set range
plot dati
sleep
load... etc

Il fatto che i dati vengano modificati non ha importanza: anzi, lo scopo del ciclo e' proprio quello di usare gli stessi comandi per leggere dati nuovi ad ogni intervallo di tempo.

Si, per l'accelerazione direi che gnuplot e' una scelta valida... Sarebbe inutile una immagine 2D.

valentino861
ok ok decisamente un altro pianeta:):)

Ora proprio le finezze. Quando rilegge il file capita che entra quando l'altro programma ha scritto solo uno dei due valori xy e quindi se plotto con le linee ogni tanto esce qualche linea infinita che mi incasina tutto, mentre se plotto con i punti è assolutamente perfetto, ogni secondo (si ho messo pause 1) mi aggiorna il grafico e non si impalla per niente (versione 2009;) ).

In realtà mi fa un pò di casino l'autoscale, cioè se fisso gli estremi su entrambi gli assi è perfetto, se fisso solo l'asse y sull'asse x fa un pò come gli pare...troppo come gli pare.

http://www.meccanicaweb.it/forum/index.php?action=dlattach;topic=212.0;attach=282;image

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.