我的问题可能是由于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库获得)
相反,我得到了段矢量中的三角剖分边。 我尝试的另一件事是使用顶点迭代器:
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演示一样。
答案 0 :(得分:4)
Alpha_shape_edges_iterator为您提供不是外部的边。 我想你对REGULAR和SINGULAR边缘感兴趣。
查看Classification_type
和classify
功能以过滤掉边缘。