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>
{
Q_OBJECT
public:
explicit MyWidget
(QWidget *parent
= 0);
virtual ~MyWidget();
private:
bool m_isFitting;
};
#endif // MYWIDGET_H
#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
To copy to clipboard, switch view to plain text mode
#include "mywidget.h"
#include <qwt_spline.h>
#include <qwt_curve_fitter.h>
QPolygonF interpolate
(const QPolygonF
& points,
int numValues
) {
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
) :{
}
MyWidget::~MyWidget()
{
}
{
m_isFitting = false;
m_start = event->pos();
m_end = event->pos();
}
{
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();
}
{
// 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();
}
{
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);
}
#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);
}
To copy to clipboard, switch view to plain text mode
Bookmarks