PDA

View Full Version : How to use curve fitting



nightroad
30th June 2011, 13:43
Hi there,

I'm drawing strokes with mouse movement. I'm keeping all points in a QVector<QPointF> or directly QPointF*, How can i apply curve fitting algorithm in my custom widget its own paintEvent. I tried somethings but i couldn't do that. Thanks ...


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QtGui>

class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
virtual ~MyWidget();

void paintEvent(QPaintEvent *event);

virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);

private:
QPointF m_start;
QPointF m_end;
QPolygonF m_points;
QPolygonF m_fittedPoints;

bool m_isFitting;

};

#endif // MYWIDGET_H





#include "mywidget.h"

#include <qwt_spline.h>
#include <qwt_curve_fitter.h>

QPolygonF interpolate(const QPolygonF& points, int numValues)
{
QwtSpline spline;
QwtSplineCurveFitter curveFitter;
bool pResult = true;
Q_ASSERT(pResult != spline.setPoints(points));
if ( !pResult ) {
return points;
}

// curveFitter.setSpline(spline);
QPolygonF fitted = curveFitter.fitCurve(points);

return fitted;
}

MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
}

MyWidget::~MyWidget()
{
}

void MyWidget::mousePressEvent(QMouseEvent *event)
{
m_isFitting = false;
m_start = event->pos();
m_end = event->pos();
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
m_start = m_end;
m_end = event->pos();

// m_points.append(m_start);
// m_points.append(m_end);
m_points << m_start << m_end;
update();
}

void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
// I want to apply curve fitting to m_points here
m_fittedPoints = interpolate(m_points, m_points.size());
// m_fittedPoints is equal to fitted points
m_isFitting = true;
update();
}

void MyWidget::paintEvent(QPaintEvent *event)
{

QPainter painter(this);
painter.setPen(Qt::SolidLine);

if (!m_isFitting)
painter.drawLines(m_points.data(), m_points.size()/2);
else
painter.drawLines(m_fittedPoints.data(), m_fittedPoints.size()/2);
}