直线段-两点线性插值及可视化

    已知直线段AB,线性插值求插值点C的公式为:C = A*(1.0 - t) + B* t,下面是用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

 

 

 
posted @ 2019-10-20 22:56  abcstar  阅读(1275)  评论(0编辑  收藏  举报