我正在编写代码,需要非常频繁地计算两个多边形的重叠区域(一个总是正方形,另一个是简单但通常是非凸多边形)。但是,为此使用CGAL,我偶尔会遇到分段错误。以下代码提供了一个最小的示例。请注意,只要将点坐标之一移动0.001,一切就可以正常工作。
#include <CGAL/Cartesian.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Polygon_with_holes_2.h>
#include <CGAL/Boolean_set_operations_2.h>
#include <CGAL/Polygon_2_algorithms.h>
typedef CGAL::Cartesian<double> K;
typedef K::Point_2 Point;
typedef CGAL::Polygon_2<K> Polygon;
typedef CGAL::Polygon_with_holes_2<K> PolygonH;
int main()
{
// Rectangle
Point pointsA[] = { Point(0.4,0.35), Point(0.4,0.4), Point(0.45,0.4), Point(0.5,0.35) };
// Triangle
Point pointsB[] = { Point(0.428,0.412), Point(0.387,0.389), Point(0.359,0.393) };
// Convert to CGAL polygon
Polygon polyA(pointsA, pointsA + 4);
Polygon polyB(pointsB, pointsB + 3);
// Intersection
std::list<PolygonH> polyAB;
CGAL::intersection(polyA, polyB, std::back_inserter(polyAB));
}
答案 0 :(得分:0)
如果第一个多边形始终是凸形的(就像大多数正方形一样),而您只关心重叠区域,则可以轻松滚动自己的解。
考虑第一个多边形的一侧的支撑线。您将针对半个平面实现裁剪,让我们假设以x = 0为边界,WLOG。
创建一个空的输出多边形。然后依次尝试第二个多边形的所有边缘。为每个顶点分配布尔条件x> = 0。如果两个端点的条件都不同,则将轴x = 0的边的交点追加到新的多边形;那么如果该边的最终端点的条件为true,则还要附加它。
最后,您将获得一个新的多边形,它是原始图像的剪切版本。如果剪切的多边形应断开连接,该算法将产生一个沿x = 0带有附加连接边的连接多边形。但是关于面积的计算,这根本没有关系。
重复四个剪裁面并使用鞋带公式计算面积。