使用CGAL裁剪线段

4
我试图实现的目标是获取线段与一组有孔多边形的交集,然后通过掩码(一组多边形)剪切线段,结果将是另一条线段。在CGAL:Intersection between a segment and a 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
如果有人卡在使用CGAL无法剪切向量上,我发现可以使用C#和SqlGeometry解决:SqlGeometry geom1 = SqlGeometry.Parse("LINESTRING(0 15, 25 15)"); SqlGeometry geom2 = SqlGeometry.Parse("POLYGON((10 10, 20 10, 20 20, 10 20, 10 10))")SqlGeometry geom3 = geom1.STIntersection(geom2); - Matej Kompanek
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.

在搜索文档(这里这里)时,我没有找到一个多边形_2-线段_2相交函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接