首先,我要感谢迄今为止在我通过CGAL库工作时遇到的问题上为我提供帮助的每一个人,非常感谢。
我自己的背景:我对C++还很陌生,我的编程经验是在MATLAB中,所以有很多概念我学得很快,因此对我来说都很新,所以请原谅我在C++方面可能使用的错误语言。
问题:
我最近写了一些代码,使用通用多边形上的布尔集运算文档中的代码来找到多段线和圆(即多段线的缓冲区(的Minkowski和。
这里,输出中使用了General_polygon_set_2
概念,如果使用上面例子中的输出代码,我可以得到Polygon_with_holes_2
类的以下输出:
48 [775.718 -206.547 --> 769.134 -157.991] (769 -157 1 1) [769.134 -157.991 --> 770 -157] (769 -157 1 1) [770 -157 --> 768.866 -156.009] [768.866 -156.009 --> 762.282 -107.453] [762.282 -107.453 --> 703.282 -115.453] [703.282 -115.453 --> 708.072 -150.778] ...
7 15 [549.239 -193.612 --> 569.403 -216.422] ... 3 [456.756 -657.812 --> 657.930 908.153] ...
在这里,如果我理解正确的话,第一个整数指的是.outer_boundary()
中的顶点数,后面是每个"顶点"的曲线描述;边缘";一般多边形的。在我的问题中,输出将只由线性函数和圆弧组成。
线性:[775.718 -206.547 --> 769.134 -157.991]
圆弧(x单调(:(769 -157 1 1) [769.134 -157.991 --> 770 -157]
线性元素很简单,通过一条线从这个x-y坐标到另一个坐标。至于圆弧,它有点不同,它说使用这些括号()
中的自变量描述的这个圆,从这个x-y坐标到这些括号[]
中包含的另一个坐标。圆的参数是:(x,y,半径,方向(。
接下来,由于我们有孔,在.outer_boundary()
被写出之后,将显示另外两个整数。第一个表示孔的数量,第二个表示该孔中的顶点数量,然后是该孔的顶点。然后,一旦写出该孔,就会写出另一个整数来描述该孔中的顶点数量,然后对所有孔继续这样做,完成多边形的描述。
因此,我目前的问题是一次解析出每个单独的曲线,这样我就可以对它们进行操作。
我在文档中有以下功能可供使用:
.outer_boundary()
:返回表示外部边界的一般多边形。.holes_begin()
:返回孔的起始迭代器。.holes_end()
:
所以我的想法是把General_polygon_set_2
分解为General_polygon_2
,然后分解成.outer_boundary()
和不同的洞。最后,对于每一组曲线,将它们分解为单独的曲线。
我真的不知道该怎么做,我只知道我需要单独的曲线数据,这样我就可以对它们进行自己的操作。如有任何帮助,我们将一如既往地不胜感激!
注意:实际上,我在阅读了安排文档后删除了这篇帖子,认为这是一个太明显的答案,但过了一段时间,我仍然不知道如何正确获取这些信息,我认为最大的问题是我缺乏C++知识。很抱歉这是个愚蠢的问题。
正在进行的解决方案:
list<Polygon_with_holes_2> res;
S.polygons_with_holes (back_inserter (res));
list<Polygon_with_holes_2>::iterator i = res.begin();
Polygon_with_holes_2 mink = *i;
minkOuter = mink.outer_boundary();
cout << minkOuter << endl;
int numHoles = mink.holes_end()-mink.holes_begin();
cout << numHoles << endl;
现在我正在隔离这些洞,然后把它们分解成每个单独的曲线。
这里的文档声明Hole_const_iterator
的value_type是General_polygon_2
,这意味着您可以遍历所有";曲线";使用";holes_begin(("以及";孔端";,就像你想的那样。要做到这一点,请使用以下语法:
for(auto h_it = mink.holes_begin(); h_it != mink.holes_end(); ++h_it)
{
//in here h_it is an iterator with value type General_polygon_2, so *h_it will be a the polygon describing a hole. Every step of this loop will give you another hole.
}
然后,可以使用curves_begin((和curves_end((以相同的方式迭代每个多边形的曲线。
因此,迭代多边形的每条曲线:
for(auto h_it = mink.holes_begin(); h_it != mink.holes_end(); ++h_it)
{
for(auto curve_it = h_it->curves_begin(); curves_it != h_it->curves_end(); ++curves_it)
{
//*curves_it gives you a curve.
}
}