【发布时间】:2018-09-16 03:39:54
【问题描述】:
出于嵌套目的,我需要计算两个多边形 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) 中,但事实并非如此。对于在这种情况下或在一般情况下(更好)使用 CGAL::minkowski_sum_2 进行 NFP 计算的任何帮助,我将不胜感激。
【问题讨论】:
标签: computational-geometry cgal