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

(博客园最近不知道怎么了,把自己的随笔搬一些过来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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值