C++ 用CGAL裁剪线

C++ 用CGAL裁剪线,c++,computational-geometry,cgal,C++,Computational Geometry,Cgal,我试图实现的是获得线和一组带孔的多边形之间的交点->通过遮罩剪裁线(多边形集)->结果将是另一条线。 此时的问题建议使用带有两点的多边形来表示直线。在CGAL示例的帮助下,我产生了以下代码片段。我的意图是使用交点计算矩形内的部分直线。然而,结果有4个点,它似乎是在计算多边形和由直线定义的半平面之间的交点 有人能解释一下吗 typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel; typedef Kernel::Point_

我试图实现的是获得线和一组带孔的多边形之间的交点->通过遮罩剪裁线(多边形集)->结果将是另一条线。 此时的问题建议使用带有两点的多边形来表示直线。在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;
}
typedef CGAL::Exact_谓词\u Exact_构造\u内核;
typedef内核::Point_2 Point_2;
typedef CGAL::Polygon_2 Polygon_2;
typedef CGAL::带孔的多边形2带孔的多边形2;
typedef std::list Pwh_list_2;
int main()
{
多边形_2 P;//矩形
P.推回(点2(10,10));
P.推回(点2(20,10));
P.推回(点2(20,20));
P.推回(点2(10,20));
多边形_2 Q;//直线
Q.向后推(点2(0,15));
Q.推回(点2(25,15));
Pwh_列表_2对称;
Pwh_list_2::const_迭代器it;
CGAL::交叉点(Q,P,std::反向插入器(symmR));
for(it=symmR.begin();it!=symmR.end();+it){

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

  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相交函数。

如果有人无法使用CGAL剪裁向量,我使用C和SqlGeometry找到了解决方案:SqlGeometry Geometry geom1=SqlGeometry.Parse(“LINESTRING(0 15,25 15)”;SqlGeometry Geometry geom2=SqlGeometry.Parse(“多边形”)((10,20,10,20,10,10)SqlGeometry geometry geometry=geometr1.STIntersection(geomer2);