Qt Live Plot

Alles rund um die Programmierung mit Qt
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: Qt Live Plot

Beitrag von ScyllaIllciz »

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.
surfman19
Beiträge: 52
Registriert: 22. August 2008 18:20

Re: Qt Live Plot

Beitrag von surfman19 »

mein beispiel funktioniert wohl auch!

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();
Uwe
Beiträge: 176
Registriert: 9. Oktober 2005 13:37
Wohnort: München

Re: Qt Live Plot

Beitrag von Uwe »

surfman19 hat geschrieben:mit std::rotate ist die performance wohl besser
Wahrscheinlich - aber trotzdem keine gute Lösung.

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
Antworten