(博客园最近不知道怎么了,把自己的随笔搬一些过来CSDN这边)
已知直线段AB,线性插值求插值点C的公式为:C = A*(1.0 - t) + B* t,,其中t的范围为 [0.0, 1.0], 0值时候为A点,1值时候为B点
下面是用QPainter可视化
GrphWidget.h
#ifndef GRPHWIDGET_H
#define GRPHWIDGET_H
#include <QWidget>
#include "ui_grphwidget.h"
class GrphWidget : public QWidget
{
Q_OBJECT
public:
GrphWidget(QWidget *parent = 0);
~GrphWidget();
void paintEvent(QPaintEvent* event);
private:
Ui::GrphWidget ui;
};
#endif // GRPHWIDGET_H
GrphWidget.cpp
#include "grphwidget.h"
#include <QPainter>
#include <QPen>
#include <QFont>
#include <Eigen/Eigen>
//
Eigen::Vector3d linerInperpo(Eigen::Vector3d& a, Eigen::Vector3d& b, double t)
{
return a*(1.0 - t) + b*t;
}
//
GrphWidget::GrphWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
GrphWidget::~GrphWidget()
{
}
void GrphWidget::paintEvent(QPaintEvent* event)
{
// 计算
Eigen::Vector3d A(50.0,50.0,0);
Eigen::Vector3d B(400.0,360.0,0);
Eigen::Vector3d C = linerInperpo(A, B, 0.618);
// 绘制
QPainter p(this);
p.drawLine(A(0),A(1),B(0),B(1));
p.setPen(QPen(Qt::black, 4));
QFont font = p.font();
font.setPointSize(14);
p.setFont(font);
int textoffx = 4;
p.drawPoint(A(0),A(1));
p.drawPoint(B(0),B(1));
p.drawPoint(C(0),C(1));
p.setPen(QPen(Qt::blue, 2));
p.drawText(A(0)+textoffx,A(1),QString("A"));
p.drawText(B(0)+textoffx,B(1),QString("B"));
p.drawText(C(0)+textoffx,C(1),QString("C"));
p.end();
}
执行结果,QWidget 屏幕坐标是x水平朝右,y竖直朝下的, 其中点及三维向量计算用的是Eigen库,很小而且只需要配置头文件目录,不需要编译为库就行,开源常称为header-only