4

我想要实现的是获得线和一组带孔的多边形之间的交集->通过掩码(多边形集)剪辑线->结果将是另一条线。CGAL的问题:线段和多边形的交集?建议使用带有两个点的多边形来表示线。在 CGAL 示例的帮助下,我想出了以下片段。我的意图是使用交集来计算位于矩形内的线的一部分。但是,结果有 4 个点,它似乎是在计算多边形和由线定义的半平面之间的交集。

任何人都可以对此有所了解吗?

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2                                   Point_2;
typedef CGAL::Polygon_2<Kernel>                           Polygon_2;
typedef CGAL::Polygon_with_holes_2<Kernel>                Polygon_with_holes_2;
typedef std::list<Polygon_with_holes_2>                   Pwh_list_2;

int main()
{
  Polygon_2 P; // rectangle
  P.push_back (Point_2 (10, 10));  
  P.push_back (Point_2 (20, 10));
  P.push_back (Point_2 (20, 20));    
  P.push_back (Point_2 (10, 20));

  Polygon_2 Q; // line
  Q.push_back (Point_2 (0, 15));
  Q.push_back (Point_2 (25, 15)); 

  Pwh_list_2 symmR;
  Pwh_list_2::const_iterator it;

  CGAL::intersection (Q, P, std::back_inserter(symmR));


  for (it = symmR.begin(); it != symmR.end(); ++it) {
    std::cout << "--> ";
    print_polygon_with_holes( *it);
  }

  getchar();
  return 0;
}
4

1 回答 1

0

这段代码定义了一个交集的多边形,而不是一条线:

  Polygon_2 Q; // line
  Q.push_back (Point_2 (0, 15));
  Q.push_back (Point_2 (25, 15)); 

只有两个点,这是一个退化的多边形,从一个点到第二个点再返回。

此图像显示了两条重叠边缘弯曲并稍微分开的配置,因此更清楚发生了什么。从该图像中,您可以看到为什么结果是具有四个顶点(来自四个交点)的退化多边形。

注意:当我运行此代码时,我收到以下错误消息,解释发生了什么。

CGAL warning: check violation!
Expression : false
File       : /usr/local/include/CGAL/Boolean_set_operations_2/Gps_polygon_validation.h
Line       : 263
Explanation: The polygon boundary self overlaps.

搜索文档(此处此处),我找不到 Polygon_2-Line_2 相交函数。

于 2020-04-20T15:55:45.833 回答