我想要实现的是获得线与一组带孔的多边形之间的交集 - >通过掩码(多边形集)剪切线条 - >结果将是另一条线。 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;
}
答案 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.