我正在尝试使用 Eigen 库实现以下Bézier曲线度高程方程:
以下代码段正在计算新的控制点。在此代码中,degree
是等式中的变量n
。
const size_t dimension = 3; // 2d or 3d points
const size_t degree = 3;
const size_t order = degree + 1;
// Create and fill Eigen::Matrix with original control points
Eigen::Matrix<double, order, dimension> P;
// Fill matrix with original control points. Should be degree + 1 points.
// Calculate the new control points
Eigen::Matrix<double, degree, 1> M1 = FillElevationMatrix<double, degree>();
Eigen::Matrix<double, degree, 1> M2;
M2.setOnes();
M2 -= M1;
Eigen::Matrix<double, degree, dimension> Q;
for (size_t i = 0; i < degree; ++i) {
Q.block(i, 0, 1, dimension) = (M1.row(i) * P.row(i)) + (M2.row(i) * P.row(i + 1));
}
有没有办法消除循环并一次性完成计算?或者,更一般地说,如何将一列标量(nx 1矩阵)乘以焦虑矩阵,以便在一次操作中只将第一个矩阵的相应行乘以第二个矩阵中相应行的每个元素吗。循环一次一行。我想要的是这样的:
Q = (M1 * P.block(0, 0, degree, dimension)) + (M2 * P.block(1, 0, degree, dimension));