我刚刚进入Eigen,并试图使用我在网上找到的一个例子将飞机拟合到一系列3d点。但是,我的结果总是为零。我有:
template<class Vector3>
std::pair<Vector3, Vector3> best_plane_from_points(const std::vector<Vector3> & c)
{
// copy coordinates to matrix in Eigen format
size_t num_atoms = c.size();
Eigen::Matrix< Vector3::Scalar, Eigen::Dynamic, Eigen::Dynamic > coord(3, num_atoms);
for (size_t i = 0; i < num_atoms; ++i) coord.col(i) = c[i];
// calculate centroid
Vector3 centroid(coord.row(0).mean(), coord.row(1).mean(), coord.row(2).mean());
// subtract centroid
coord.row(0).array() -= centroid(0); coord.row(1).array() -= centroid(1); coord.row(2).array() -= centroid(2);
// we only need the left-singular matrix here
// http://math.stackexchange.com/questions/99299/best-fitting-plane-given-a-set-of-points
auto svd = coord.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV);
Vector3 plane_normal = svd.matrixU().rightCols<1>();
std::cout << plane_normal << std::endl;
return std::make_pair(centroid, plane_normal);
}
void main()
{
Eigen::Vector3f point1(2, 2, 2);
Eigen::Vector3f point2(4, 2, 3);
Eigen::Vector3f point3(4, 2,1);
Eigen::Vector3f point4(2, 2,3);
std::vector<Eigen::Vector3f> points;
points.push_back(point1);
points.push_back(point2);
points.push_back(point3);
points.push_back(point4);
best_plane_from_points(points);
std::cin.get();
}
这是在这里使用的正确方法吗?或者在Eigen中有更好的功能来做我想做的事情吗?
总结:
我在3d空间中有n个点。我想从这些点计算最佳拟合平面并返回该平面的欧拉角。
谢谢你的帮助。