在 CGAL 中解析来自 General_polygon_set_2 的单个曲线

Parse Individual Curves from General_polygon_set_2 in CGAL

首先,我要感谢迄今为止在我使用 CGAL 库时遇到的问题上帮助过我的所有人,非常感谢。

我自己的背景:我对 C++ 还是很陌生,我的编码经验是在 MATLAB 中,所以有很多概念我学得很快,因此对我来说很新,所以请原谅我的错误语言我可能会使用 C++。

问题:

我最近写了一些代码,使用 Boolean Set Operations on General Polygons.

的文档中的代码找到折线和圆(即折线的缓冲区)的 Minkowski 和

这里在输出中使用了一个General_polygon_set_2的概念,如果使用上面例子中的输出代码,我可以得到一个Polygon_with_holes_2class的如下输出:

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 坐标到这些括号中包含的另一个坐标 []. circle 的参数是:(x,y,radius,orientation).

接下来,由于我们有空洞,所以在写完.outer_boundary()之后,再显示两个整数。第一个说明洞的数量,第二个说明这个洞中的顶点数,然后是那个洞的那些顶点。然后,一旦该孔被写出,另一个整数将被写入,描述该孔中的顶点数,然后对所有孔继续,完成对多边形的描述。

因此,我当前的问题是一次解析出每条单独的曲线,以便我可以对它们进行操作。

我可以使用 documentation 中的以下函数:

.outer_boundary(): returns表示外边界的一般多边形。 .holes_begin(): returns 孔的开始迭代器。 .holes_end():

所以我的想法是将 General_polygon_set_2 分解为 General_polygon_2,然后将其分解为 .outer_boundary() 和不同的孔。最后,对于每组曲线,将它们分解成单独的 curves.

我不太确定该怎么做,我只知道我需要单独的曲线数据,以便我可以对它们进行自己的操作。任何帮助,我们将一如既往地非常感激!

注意:我实际上在通读安排文档后删除了这个 post,认为这是一个太明显的答案,但过了一段时间我仍然真的不知道如何正确地提取这个信息,我想最大的问题是我对 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;

现在我正在努力隔离孔,然后将它们分解成每条单独的曲线。

The doc here 表示 Hole_const_iterator 的 value_type 是 General_polygon_2,这意味着您可以使用“[=22] 遍历所有“曲线” =]()" 和 "holes-end",就像你想的那样。为此,请使用以下语法:

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() 以相同的方式迭代每个多边形的曲线。

所以要迭代polygon_with_holes的每条曲线:

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.
  }
}