Как получить все точки из облака точек, находящиеся на поверхности данной сферы - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть облако точек, состоящее из PointXYZRGB . Я определил сферу s в трехмерном пространстве, поэтому известны следующие вещи:

  1. Центр o сферы s как (x, y, z)
  2. Радиус r сферы s

Я хочу получить все точки этого облака точек, которое находится на поверхности данной сферы.

std::vector<PointXYZRGB> getAllSurfacePoints(
                         pcl::PointCloud<pcl::PointXYZRGB> cloud){
}

1 Ответ

0 голосов
/ 27 апреля 2018

Попробуйте вызвать эту функцию один раз, чтобы удалить внутренние точки и еще раз, чтобы удалить внешние точки.

pcl::PointCloud<pcl::PointXYZI>::Ptr 
passThroughFilterSphere(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud, 
pcl::PointXYZI sphereCenterPoint, const double radius, bool remove_outside)
    {
        pcl::PointCloud<pcl::PointXYZI>::Ptr  filteredCloud(new pcl::PointCloud<pcl::PointXYZI>);
        float distanceFromSphereCenterPoint;
        bool pointIsWithinSphere;
        bool addPointToFilteredCloud;
        for (int point_i = 0; point_i < cloud->size(); ++point_i)
        {
            distanceFromSphereCenterPoint = pcl::euclideanDistance(cloud->at(point_i), sphereCenterPoint);
            pointIsWithinSphere = distanceFromSphereCenterPoint <= radius;
            addPointToFilteredCloud = (!pointIsWithinSphere && remove_outside) || (pointIsWithinSphere && !remove_outside);
            if (addPointToFilteredCloud){
                filteredCloud->push_back(cloud->at(point_i));
            }
        }
        return filteredCloud;
    }
...