我利用CGAL判断点是否落在多边形内部,如下代码会发生异常报错:
Point_2 p(x, y);
for (const auto& polygon : cgalPolygons)
{
Polygon_2 poly(polygon.begin(), polygon.end());
if (poly.bounded_side(p) == CGAL::ON_BOUNDED_SIDE)
{
break;
}
}
原因暂不清楚,但是可以使用非CGAL的方法代替该需求
射线投射法检查点是否在多边形内部:
Point_2 p(x, y);
// 使用射线投射法检查点是否在多边形内部
bool isInsideAnyPolygon = false;
for (const auto& polygon : cgalPolygons)
{
if (isPointInPolygon(p, polygon))
{
isInsideAnyPolygon = true;
break;
}
}
其中isPointInPolygon函数定义如下:
bool isPointInPolygon(const Point_2& p, const std::vector<Point_2>& polygon)
{
int n = polygon.size();
bool inside = false;
for (int i = 0, j = n - 1; i < n; j = i++)
{
double xi = polygon[i].x(), yi = polygon[i].y();
double xj = polygon[j].x(), yj = polygon[j].y();
bool intersect = ((yi > p.y()) != (yj > p.y())) &&
(p.x() < (xj - xi) * (p.y() - yi) / (yj - yi) + xi);
if (intersect)
{
inside = !inside;
}
}
return inside;
}