是否有用于查找二维线 (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.
我有一条从 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.