用Eigen过滤球体内部的点

时间:2013-10-01 09:06:33

标签: c++ eigen

我有一组3D点,我需要计算哪一个最接近给定点 p 。我想知道哪些可能是在Eigen中做到这一点的正确方法。到目前为止,我有:

Matrix<double, Dynamic, 3> points; // The set of 3D points
Matrix<double, 1, 3> p;

// Populate the "points" matrix

...

// Fill a matrix with several copies of "p" in order to match the size
of "points"

Matrix<double, Dynamic, 3> pp(points.rows(), 3);

pp = Matrix<double, Dynamic, 1>::Ones(points.rows, 1) * p;

Matrix<double, Dynamic, 1> sq_distances = (points - pp).rowwise.squaredNorm();
Matrix<bool, Dynamic, 1> nearest_points = sq_distances < (dist_threshold * dist_threshold);

然后我可以通过某种方式提取满足“nearest_points”条件的“点”中的点,如

Matrix<double, Dynamic, 3> nearest = points(nearest_points);

1 个答案:

答案 0 :(得分:2)

对于我最近的建议:

int i;
double sqdist = (points.rowwise()-p).rowwise().squaredNorm().minCoeff(&i);
nearest = points.row(i);

对于给定球中的那些,你当前必须自己编写一个循环:

ArrayXd sqdists = (points.rowwise()-p).rowwise().squaredNorm();
Matrix<double,Dynamic,3> nearests( (sqdists<sqradius).count(), 3 );
int count = 0;
for(int i=0; i<points.rows(); ++i)
  if(sqdists(i)<sqradius)
    nearests.row(count++) = points.row(i);