CGAL 2D alpha形状轮廓

时间:2014-09-27 18:38:46

标签: c++ cgal

我的问题可能是由于CGAL c ++库中的新功能,但我的任务一直在滑落。也就是说,我想找到一组点的alpha形状,但似乎我不理解2D alpha形状可用的迭代器。

这就是我的尝试:

Alpha_shape_2 alpha(pointsVec.begin(), pointsVec.end(), FT(1000), Alpha_shape_2::GENERAL);
//which compiles nicely and provides the regular output where pointsVec is the list of Point_2

//Then I saw the edge iterator at the CGAL documentation

template <class OutputIterator> //Method-iterator for CGAL alpha shapes in order to get the edges from alpha shape object
void alpha_edges( const Alpha_shape_2& A,
                  OutputIterator out)
{
    for(Alpha_shape_edges_iterator it = A.alpha_shape_edges_begin();
        it != A.alpha_shape_edges_end();
        ++it){
        *out++ = A.segment(*it);
    }
}

//Then when using the following code:

std::vector<Segment> segments;
alpha_edges(alpha, std::back_inserter(segments));

//I get the list of all the edges in the triangulation used for alpha shapes.

问题是我需要边界,如下图所示(使用R alphahull库获得)

Alphahull

相反,我得到了段矢量中的三角剖分边。 我尝试的另一件事是使用顶点迭代器:

for (Alpha_shape_2::Alpha_shape_vertices_iterator it = alpha.Alpha_shape_vertices_begin(); it != alpha.Alpha_shape_vertices_end(); ++it)
      {
          int xalpha = (*it)->point().x();
          int yalpha = (*it)->point().y();
          alphaCoords.push_back(cv::Point(xalpha, yalpha)); //this for openCV
      }

但结果是一样的。它输出所有顶点,因此绘图只连接它们,没有轮廓(在图像上绘制线条)。

我知道3D中有一个找到边界形状顶点的函数:

as.get_alpha_shape_vertices(back_inserter(al_vs), Alpha_shape_3::REGULAR); 

但2D不存在。另外,我有兴趣找出在哪里可以指定用于成形圆半径的alpha值,就像在CGAL 2D形状手册中提供的windows演示一样。

1 个答案:

答案 0 :(得分:4)

Alpha_shape_edges_iterator为您提供不是外部的边。 我想你对REGULAR和SINGULAR边缘感兴趣。

查看Classification_typeclassify功能以过滤掉边缘。