【问题标题】:Parse Individual Curves from General_polygon_set_2 in CGAL从 CGAL 中的 General_polygon_set_2 解析单个曲线
【发布时间】:2021-07-19 14:59:15
【问题描述】:

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

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

问题:

我最近编写了一些代码,使用 Boolean Set Operations on General Polygons 文档中的代码找到折线和圆的 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() 中a 顶点的数量,然后是对一般多边形的每个“边”的曲线的描述。在我的问题中,输出将仅包含线性函数和圆弧。

线性:[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():返回代表外边界的一般多边形。 .holes_begin():返回孔的开始迭代器。 .holes_end():

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

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

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

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

【问题讨论】:

    标签: c++ cgal


    【解决方案1】:

    The doc here 声明 Hole_const_iterator 的 value_type 是 General_polygon_2,这意味着您可以使用“holes_begin()”和“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.
      }
    }
    

    【讨论】:

    • 太好了,谢谢!我认为我遇到的问题是基于我缺乏对 C++ 中带有指针的迭代器的理解这一事实,但我现在明白了它们是如何工作的。
    猜你喜欢
    • 2014-06-22
    • 2013-03-05
    • 1970-01-01
    • 2018-07-23
    • 2012-08-02
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多