用eigen库绘制样条曲线

在这里插入图片描述

1 、在于处理器中添加宏定义
EIGEN_MALLOC_ALREADY_ALIGNED=0

2、添加头文件
#include “unsupported/Eigen/Splines/spline.h”
#include “unsupported/Eigen/Splines/SplineFitting.h”
#include “unsupported/Eigen/Splines/SplineFwd.h”

3、构造
QVector pts;
pts.push_back(vector3d(1,2,3));

Eigen::MatrixXd points(3,pts.size());
for(int i = 0;i< pts.size;i++)
{
points(0,i) = pts[i].x;
points(1,i) = pts[i].y;
points(2,i) = pts[i].z;
}

typedef Eigen::Spline<double,3,3> spline3d;
spline3d s = Eigen::SplineFitting::Interpolate(points,3);

4、使用
抽样取点
for(int i= 0;i<100; i++)
{
spline3d::PointType pt = s(0.01*i);
vector3d ptTemp(pt[0],pt[1],pt[2]);

}

以下是使用Eigen实现的非扭边界条件下的三次样条曲线插值的C++代码: ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; VectorXd getCoefficients(VectorXd x, VectorXd y) { int n = x.size() - 1; VectorXd h = x.tail(n) - x.head(n); VectorXd b = (y.tail(n) - y.head(n)).cwiseQuotient(h); VectorXd u(n); u(1) = 2 * (h(0) + h(1)); for (int i = 2; i < n; i++) u(i) = 2 * (h(i - 1) + h(i)) - h(i - 1) * h(i - 1) / u(i - 1); VectorXd v(n); v(1) = 6 * (b(1) - b(0)); for (int i = 2; i < n; i++) v(i) = 6 * (b(i) - b(i - 1)) - h(i - 1) * v(i - 1) / u(i - 1); VectorXd z(n + 1); z(n) = 0; for (int i = n - 1; i > 0; i--) z(i) = (v(i) - h(i) * z(i + 1)) / u(i); z(0) = 0; MatrixXd A(n, n); A.setZero(); for (int i = 0; i < n - 1; i++) { A(i, i) = (h(i) + h(i + 1)) / 3; A(i, i + 1) = h(i + 1) / 6; A(i + 1, i) = h(i + 1) / 6; A(i + 1, i + 1) = (h(i + 1) + h(i + 2)) / 3; } VectorXd b_prime(n); for (int i = 0; i < n; i++) b_prime(i) = (y(i + 1) - y(i)) / h(i) - (h(i) * (2 * z(i) + z(i + 1))) / 6; VectorXd c = A.colPivHouseholderQr().solve(b_prime); VectorXd d(n); for (int i = 0; i < n; i++) d(i) = (z(i + 1) - z(i)) / (6 * h(i)); VectorXd coefficients(4 * n); for (int i = 0; i < n; i++) { coefficients.segment(4 * i, 4) << y(i), b(i), c(i), d(i); } return coefficients; } double evaluateSpline(VectorXd coefficients, double x, VectorXd knotVector) { int n = knotVector.size() - 1; int i = n - 1; while (i >= 0 && x < knotVector(i)) { i--; } i = min(max(i, 0), n - 1); double h = knotVector(i + 1) - knotVector(i); double xi = x - knotVector(i); double a = coefficients(4 * i); double b = coefficients(4 * i + 1); double c = coefficients(4 * i + 2); double d = coefficients(4 * i + 3); return a + b * xi + c * xi * xi + d * xi * xi * xi; } int main() { VectorXd x(6); x << 0, 1, 2, 3, 4, 5; VectorXd y(6); y << 0, 1, 0, -1, 0, 1; VectorXd coefficients = getCoefficients(x, y); VectorXd knotVector(7); knotVector << -1, x, 6; double x_new = 2.5; double y_new = evaluateSpline(coefficients, x_new, knotVector); cout << "f(" << x_new << ") = " << y_new << endl; return 0; } ``` 该代码使用了Eigen中的矩阵操作和线性求解器,实现了非扭边界条件下的三次样条曲线插值。其中,getCoefficients函数用于求解三次样条曲线的系数,evaluateSpline函数用于根据系数和插值节点插值新的数据点。在main函数中,我们先定义了一组数据点x和y,然后使用getCoefficients函数求解系数,再使用evaluateSpline函数插值新的数据点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码猿杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值