Qt Live Plot
-
ScyllaIllciz
- Beiträge: 200
- Registriert: 9. Juli 2010 19:31
Re: Qt Live Plot
Was ist Dein Ergebnis? Ich vermute das ist nocht nicht was Du willst. Ich denke das erase ist nicht das richtige. Damit löschst Du ja nur den letzten Wert. Wenn Du aber einen kontinuierlichen Plot haben willst, mußt Du die Daten weiter schieben. Genau das macht das rotate. Das schiebt alles im Kreis. Somit muss man den letzten Wert nur noch überschreiben, ohne Löschen und neu Einfügen. Abstrakt [1 2 3 4 5], rotate+1 [2 3 4 5 1], letzten Wert überschreiben [2 3 4 5 6] usw. Das ganze auch mit der X-Achse.
Re: Qt Live Plot
mein beispiel funktioniert wohl auch!
mit std::rotate ist die performance wohl besser:
mit std::rotate ist die performance wohl besser:
Code: Alles auswählen
int Plot1_TimeScale = 1;
int Plot1_TimeBase = DATA_POINTS-1;
static int Plot1_timeOffset = 0;
if(vec_xval.size() == DATA_POINTS)
{
Plot1_timeOffset += Plot1_TimeScale;
std::rotate(vec_xval.begin(), vec_xval.begin()+Plot1_TimeScale, vec_xval.end());
std::rotate(vec_yval.begin(), vec_yval.begin()+Plot1_TimeScale, vec_yval.end());
vec_xval[DATA_POINTS-1] = sx;
vec_yval[DATA_POINTS-1] = yvalue;
}
else
{
vec_xval.push_back(sx);
vec_yval.push_back(yvalue);
}
sx++;
if(size < DATA_POINTS)
{
size++;
}
curve->setRawSamples(&vec_xval[0], &vec_yval[0], size);
curve->setSymbol(new QwtSymbol(QwtSymbol::Cross, Qt::NoBrush,QPen(Qt::black), QSize(5, 5) ) );
curve->setPen(QColor(Qt::darkGreen));
curve->setStyle(QwtPlotCurve::Lines);
curve->attach(ui->qwtPlot);
ui->qwtPlot->setAxisScale(2, Plot1_timeOffset, Plot1_timeOffset + Plot1_TimeBase);
ui->qwtPlot->replot();
Re: Qt Live Plot
Wahrscheinlich - aber trotzdem keine gute Lösung.surfman19 hat geschrieben:mit std::rotate ist die performance wohl besser
Die Kurve iteriert einzeln über die Samples d.h. die müssen nicht entsprechend ihrer Reihenfolge im Daten Objekt gespeichert sein.
Die schnellste Lösung ist daher einen Ringpuffer zu implementieren und einfach den neuen Wert auf die Position des aktuellen Start Index zu schreiben. Anschliessend musst Du nur den Index inkrementieren.
Schau Dir mal den CircularBuffer aus dem refreshtest Beispiel an - ist nicht exakt Deine Situation, aber Du solltest verstehen wie es geht.
Uwe