CGAL / minkowski_sum_2的不适合多边形问题

时间:2018-09-16 03:39:55

标签: computational-geometry cgal

出于嵌套的目的,我需要计算两个多边形A和B的不适合多边形(NFP)。 A和B的NFP可以定义为NFP(A,B)= A(+)-B,其中(+)是Minkowski和。我正在使用C ++和CGAL库,该库提供用于计算Minkowski和的函数。好了,在这个小的上下文描述之后,让我介绍一下我的问题。有一些众所周知的二维不规则嵌套问题的基准实例,我打算在研究中使用它们。在称为jakobs2的实例中,有几对多边形完全吻合在一起,如图所示:

jakobs2实例中的精确匹配情况

我已使用以下代码在C ++中创建了这些多边形:

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/minkowski_sum_2.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Point_2<Kernel> Point_2;
typedef CGAL::Polygon_2<Kernel, std::vector<Point_2>> Polygon_2;
typedef CGAL::Polygon_with_holes_2<Kernel, std::vector<Point_2>> Polygon_with_holes_2;

(...)

Polygon_2 *A = new Polygon_2();
A->push_back(Point_2(0, 0));
A->push_back(Point_2(10, 0));
A->push_back(Point_2(10, 10));
A->push_back(Point_2(8, 10));
A->push_back(Point_2(8, 2));
A->push_back(Point_2(2, 2));
A->push_back(Point_2(2, 10));
A->push_back(Point_2(0, 10));

Polygon_2 *B = new Polygon_2();
B->push_back(Point_2(0, 0));
B->push_back(Point_2(6, 0));
B->push_back(Point_2(6, 6));
B->push_back(Point_2(4, 6));
B->push_back(Point_2(4, 2));
B->push_back(Point_2(2, 2));
B->push_back(Point_2(2, 6));
B->push_back(Point_2(0, 6));

Polygon_2 *minus_B = new Polygon_2();
minus_B->push_back(Point_2(0, 0));
minus_B->push_back(Point_2(-6, 0));
minus_B->push_back(Point_2(-6, -6));
minus_B->push_back(Point_2(-4, -6));
minus_B->push_back(Point_2(-4, -2));
minus_B->push_back(Point_2(-2, -2));
minus_B->push_back(Point_2(-2, -6));
minus_B->push_back(Point_2(0, -6));

并且,为了计算NFP(A,B),我使用了这个:

Polygon_with_holes_2 nfp_A_B = CGAL::minkowski_sum_2(*A, *minus_B);

由这些点描述了minkowski_sum_2计算出的变量nfp_A_B:

(4, 10), (2, 10), (-4, 10), (-6, 10), (-6, 4), (-6, -6), (-4, -6),
(-2, -6), (0, -6), (6, -6), (10, -6), (10, 0), (10, 10)

此点序列形成一个正方形。从(2,-6)到(2,2)的线段应包括在NFP(A,B)中,但没有。对于在这种情况下,或者在一般情况下(更好)完全适合的NFP计算中使用CGAL :: minkowski_sum_2提供的帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

Minkowski和运算的输出是一个正则化多边形(或带孔的多边形)。 CGAL的2D正则化布尔集操作手册包含确切的定义。简而言之,如果P是非正则多边形,则P * =闭包(interior(P))被正则化。这意味着输出不能包含退化特征,例如孤立点和“天线”。 (您声称缺失的网段有时称为天线。)

您希望获得的功能不是开箱即用的。实际上,需要其他接口来支持此功能。但是,通过一些工作,您应该可以得到它。您需要做的是获取基础2D布置,然后遍历该布置以提取退化的多边形。您将不得不深入研究代码。这是一个开始的提示。

有3个函数实现2D Minkowski和:(i)分解,(ii)卷积和(iii)简化卷积。我将从(ii)(减少卷积)开始。在这里,我们计算卷积周期并将其插入2D排列中。然后,我们计算该布置的面的绕线数,以找出哪些面是所得多边形的一部分,哪些不是。您需要拦截这种安排,然后自己处理。