是否有用于查找二维线 (Line_2) 和一组带孔的二维多边形 (Polygon_with_holes_2) 之间的所有交点的 CGAL 函数?

Is there a CGAL function for finding all intersecting points between a 2D line (Line_2) and a set of 2D polygons with holes (Polygon_with_holes_2)?

我有一条从 0, 0 到 1024, 0 的线。线的两端之间有许多带孔的多边形。我想知道是否有任何CGAL函数可以告诉我线段和所有带孔的多边形之间的所有交点。

或者,线与带孔的单个多边形相交的函数目前也足够了。这个函数必须告诉我直线与带孔的多边形相交的所有点。

答案是否定的。多边形的交集函数仅适用于两个多边形,交集的含义是 平面 的一部分,由位于两个多边形内的点组成。如果你想找到一个线段和多边形边界的交点 - 你需要一个一个地提取所有边界边缘并计算所有一个接一个的路口。例子如下:

#include <iostream>
#include <vector>

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>

using Kernel = CGAL::Exact_predicates_exact_constructions_kernel;
using Polygon = CGAL::Polygon_2<Kernel>;
using Point = Polygon::Point_2;
using Segment = Polygon::Segment_2;

int main()
{
  // ------ define segment
  const Segment s{{-1000, 0}, {1000, 0}};
  // ------ define polygon
  const std::vector<Point> pts{{3, 3}, {-3, 3}, {-3, -3}, {3, -3}};
  const Polygon p(pts.cbegin(), pts.cend());
  // ------ find all intersections of the segment with polygon edges
  for (auto eit = p.edges_begin(); eit != p.edges_end(); ++eit)
  {
    const auto res = CGAL::intersection(s, *eit);
    if (res)
    {
      const auto pt = boost::get<Point>(&*res);
      std::cout << *pt << std::endl;
    }
  }
}

如果您使用带孔的多边形,则应对所有孔重复此过程。上面的示例是交叉处理的简化 - 可以找到更完整的示例 here.