已知直线段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