使用CGAL剪切线条

时间:2012-10-24 08:50:40

标签: c++ computational-geometry cgal

我想要实现的是获得线与一组带孔的多边形之间的交集 - >通过掩码(多边形集)剪切线条 - >结果将是另一条线。 CGAL: Intersection between a segment and a polygon?处的问题建议使用带有两个点的Polygon来表示该线。在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;
}

1 个答案:

答案 0 :(得分:0)

此代码定义了相交的多边形,而不是直线:

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

只有两个点,这是一个退化的多边形,从一个点到另一个点再到另一个。

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

注意:当我运行这段代码时,收到以下错误消息,说明发生了什么情况。

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.

搜索文档herehere时,找不到Polygon_2-Line_2交点函数。