Salve a tutti, prima di tutto mi presento: sono Jacopo e, al mio secondo anno di Specialistica in Ingegneria Biomedica sono stato incaricato di compilare un semplice (per voi sicuramente) programma che riceve in ingresso da una porta COM un segnale, fa una piccola parte di elaborazione e ne plotta l'andamento su una finestra.
Fino a qui tutto bene, per ottenere l'effetto che il prof voleva ottenere, cioè l'aggiornamento dei grafici in "stile ECG" ho dovuto implementare la funzione di disegno del grafico punto per punto, cancellando man mano che la "finestra mobile" scorre i punti precedentemente plottati.
Questa cosa la faccio utilizzando un repaint che cancella i punti del grafico immediatamente successivi a quelli in cui mi trovo. Il comando lo uso sfruttando il fatto che posso dargli una finestra in cui operare di cui determino angolo in alto a sinistra e in basso a destra.
Il problema è insorto quando ho plottato un'altro grafico sulla medesima finestra. (Devo plottare lo spettro di potenza del segnale).
La natura di questo grafico è diversa da quella del grafico precedente:
- In una classe riempio un array fino a 256 valori, a quel punto lo processo e passo l'array da plottare alla classe che disegna le funzioni vere e proprie.
- Anche questo grafico lo disegno punto per punto.
Il problema insorge su quando e come devo fare il repaint di quest'altra zona della finestra.
Di seguito vi linko il codice di come faccio io in questo momento, quello che ottengo è che il grafico rimane plottato per pochi millesimi di secondo e poi sparisce. Per poi "riflashare" dopo altri 256 valori acquisiti. Ecco, io vorrei semplicemente che rimanesse li, e che il repaint venisse effettivamente fatto solo quando serve, cioè quando plotto un nuovo grafico.
codice:
if(counter==256){
repaint(PADx, PADy, w-20, h-20);
for(int i = 1; i < data.length; i++) {
double x = PADx + i*xInc;
double y = h - 20 - scale*data[i];
g2.draw(new Line2D.Double(xold, yold, x, y));
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
xold=x; yold=y; }
counter=0;
}
Scusate se non sono stato particolarmente chiaro, ho provato a esserlo e contemporaneamente non rubarvi troppo tempo, se così non fosse mi scuso. E' la prima volta che chiedo aiuto per qualcosa del genere.
J.