Curve Fitting Not Always Applied
-
Hi
Installation Information:
Qt Creator 2.0.1
Based on Qt 4.7.0 (32 bit)
Built on Aug 24 2010 at 11:00:55
From revision 97d831e3deFirst of all thanks for Qwt. It has proved to be a very useful library for my Qt work.
I am currently having an intermittent problem with the QwtSplineCurveFitter class.
Sometimes the curve fitting does not seem to occur?See attached example image. I have also attached my plot class constructor and my update plot slot.
The connected signal call is as follows:@void BytesProcessed(int size, double * xArray, double * yArray, double yMax, int BtNo, bool bResetScale);
emit BytesProcessed( ( scDPPtr->dQVPressure.data()[scDPPtr->GetCount()-1].size()-1),
scDPPtr->dQVTime.data(),
scDPPtr->dQVPressure.data()[scDPPtr->GetCount()-1].data(),
scDPPtr->dPeakRawPressure.data()[scDPPtr->GetBreathCount()-1],
scDPPtr->GetBreathCount()-1,bNew);@The arrays used in the signal are referenced from the following QVectors:
@QVector < QVector <double> > dQVPressure;
QVector <double> dQVTime;
QVector <double> dPeakRawPressure;@My plots seem to perform fairly well in almost real time but if you have any advice on optimising my code it would be appreciated greatly.
Is there a limit to the number of splines or spline points that can be created? I am plotting up to 4 plots of 50 curves that are each curve fitted.
Is my Spline Size a problem? It seems to give better results than lower settings but does begin to inhibit performance with larger numbers of plots e.g. 4 X 20+ curves.
@fitter[i]->setSplineSize(1000);@
http://img46.imageshack.us/i/noncurvefitting.jpg/
@Plot::Plot(QWidget parent, QString pTitle, QString pAxisX, QString pAxisY ) :
plotTitle(pTitle), plotAxisX(pAxisX), plotAxisY(pAxisY){
setTitle(plotTitle);
dyMaxMax = 0.0; dxMaxMax = 0.0;
BtIndex = 0;
bRefresh = true;
xBlank[0]=0.0;
yBlank[0]=0.0;
xBlank[1]=0.0;
yBlank[1]=0.0;
graphAxes = (graphType)0;
setAxisTitle(xBottom, plotAxisX + " (Bt " + QString::number(BtIndex) +")" );
setAxisScale(xBottom, 0.0, 0.001);
setAxisTitle(yLeft, plotAxisY);
setAxisScale(yLeft, 0.0, 0.001);
static const QColor qCol(255,255,255);
static const QColor qColA[50];
for (int i=0; i<50; i++){ qColArray[i]=(255,i5,i*5) ; }
this->setCanvasBackground(qCol);for (int i=0; i<50; i++) { d_curve[i] = new QwtPlotCurve("Data Moving Right"); d_curveLin[i] = new QwtPlotCurve("Linear"); } int colcount = 0; for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { for (int k=0; k<4; k++) { if (colcount <50) { d_Color[colcount] = new QColor(((3-i)*(140/3)),(j*(140/3)),(k*(140/3))); d_Pen[colcount] = new QPen( *d_Color[colcount], 0, Qt::SolidLine ) ; d_curve[colcount]->setPen(*d_Pen[colcount] ) ; colcount++; }else{ i=4; j=4; k=4; } } } } d_Pen[54] = new QPen( *d_Color[49], 0, Qt::DotLine) ; for (int i=0; i<50; i++) { d_curveLin[i]->setPen(*d_Pen[54] ) ; } for (int i=0; i<50; i++) { fitter[i] = new QwtSplineCurveFitter(); fitter[i]->setSplineSize(1000); d_curve[i]->setCurveAttribute(QwtPlotCurve::Fitted,true); fitter[i]->setFitMode(QwtSplineCurveFitter::Spline); d_curve[i]->setCurveFitter(fitter[i]); bSmoothed[i]=true; d_curveLin[i]->setCurveAttribute(QwtPlotCurve::Fitted,false); d_curve[i]->setRenderHint(QwtPlotItem::RenderAntialiased); d_curve[i]->setPaintAttribute( QwtPlotCurve::ClipPolygons, true ); d_curve[i]->attach(this); d_curveLin[i]->setRenderHint(QwtPlotItem::RenderAntialiased); d_curveLin[i]->setPaintAttribute( QwtPlotCurve::ClipPolygons, true ); d_curveLin[i]->attach(this); }
}@
-
@void Plot::UpdatePlotTest(int firstIndex, int lastIndex, double dyMax, double * dxarray, double * dyarray, int BtNo, bool bResetScale){
if (BtIndex!= BtNo ) {
BtIndex = BtNo;
setAxisTitle(xBottom, plotAxisX + " (Bt " + QString::number(BtIndex+1) + ")" ); }
if (this->bRefresh){ dyMaxMax = 0.001; dxMaxMax = 0.001; }
if (dyMaxMax < dyMax) { dyMaxMax = dyMax; setAxisScale(yLeft, 0, (dyMaxMax*1.05) ); }
if (dxMaxMax < dxarray[lastIndex]) {
dxMaxMax = dxarray[lastIndex];
setAxisScale(xBottom, dxarray[firstIndex], dxMaxMax); }
d_Pen[BtNo]->setWidth(4);
d_Pen[BtNo]->setColor(d_Color[0]->rgb());
d_curve[BtNo]->setCurveAttribute(QwtPlotCurve::Fitted,false);
fitter[BtNo]=NULL;
d_curve[BtNo]->setCurveFitter(NULL);
d_curve[BtNo]->setPen(*d_Pen[BtNo] ) ;
bSmoothed[BtNo] = false;
if (BtNo>0){
for (int jj = 0; jj<=49; jj++){
if (jj!=BtNo){
if (bSmoothed[jj] == false){
d_Pen[jj]->setWidth(0);
d_Pen[jj]->setColor(d_Color[jj]->rgb());
fitter[jj] = new QwtSplineCurveFitter();
fitter[jj]->setSplineSize(1000);
d_curve[jj]->setCurveAttribute(QwtPlotCurve::Fitted,true);
fitter[jj]->setFitMode(QwtSplineCurveFitter::Spline);
d_curve[jj]->setCurveFitter(fitter[jj]);
d_curve[jj]->setPen(*d_Pen[jj] ) ;
bSmoothed[jj]= true;
}
}
}
}
d_curve[BtNo]->setRawSamples(dxarray,dyarray,((lastIndex-firstIndex)+1) );
d_curveLin[BtNo]->setRawSamples(dxarray,dyarray,((lastIndex-firstIndex)+1) );
if (bResetScale == true){
for (int jj = 0; jj<=BtNo; jj++){
if (bSmoothed[jj] == false){
d_Pen[jj]->setWidth(0);
d_Pen[jj]->setColor(d_Color[jj]->rgb());
fitter[jj] = new QwtSplineCurveFitter();
fitter[jj]->setSplineSize(1000);
d_curve[jj]->setCurveAttribute(QwtPlotCurve::Fitted,true);
fitter[jj]->setFitMode(QwtSplineCurveFitter::Spline);
d_curve[jj]->setCurveFitter(fitter[jj]);
d_curve[jj]->setPen(*d_Pen[jj] ) ;
bSmoothed[jj]= true;
}
}
this->replot();
this->repaint();
}
this->bRefresh = false;
}void Plot::RePlot(){this->replot();}@
-
Uwe has kindly begun to help me on
"http://www.qtcentre.org/threads/39533-Cu…ght=#post181435":http://www.qtcentre.org/threads/39533-Cu…ght=#post181435
I will follow this up there as I don't want to waste experts tiem with multiple posts.