我正在寻找一种算法,我可以检查凸多边形(形状1)是否适合另一个多边形(形状2)。
我的第一项研究将我带到了#34;包装不规则的形状"。这在我看来有点矫枉过正。我只有一个容器和一个对象。
形状1通常是凸多边形。形状2可以是凸面或凹面。
我的应用:我有三维激光扫描仪来测量原木,它给我形状2.我也有不同的切割轮廓,我认为是凸包,形状为1。
现在我想检查切割配置文件是否适合我的激光配置文件。
答案 0 :(得分:4)
动机。如果您要问某个半径的圆盘B是否适合多边形P,那么computational geometry中有一个标准方法:检查最大内切圆是否有半径不小;见this stackoverflow answer:
计算最大内切圆的上述算法非常简单":计算所谓的Generalized Voronoi Diagram并获取具有最大间隙半径的Voronoi节点。 (这只是动机,请继续阅读一分钟。)
在你的情况下,你的Shape 2不是一个球;好吧,确切地说,不是欧几里得球。但实际上,你的Shape 2作为凸多边形B,可以定义凸距离函数并计算Voronoi diagram under this polyhedral distance function。但这是更多的理论背景,也许不是你想要为生产代码实现的东西。
这些Voronoi图与计算偏移曲线密切相关,例如,NC加工中的刀具路径规划。有关讨论和下图,请参阅此blog article:
当且仅当在距离r处存在偏移曲线时,半径为r的球B才适合形状P. (实际上,您获得了所有有效中心的集合,即半径为r的偏移曲线内的集合。)这些偏移曲线可以在数学上描述为Minkowski difference,如博客文章中所述。
<强>明可夫斯基差。强> 所以现在我们可以回到你原来的问题了。凸多边形B是否适合多边形P?当且仅当Minkowski差(P-B)是非空集时才会这样做; (P-B)中的任何中心都是一个例子。
基于上图的更多细节:让我们用点反射后的形状B表示-B = {-v:v in B}。 (在任何你喜欢的地方选择原点;我用小十字架用原点来表示它。)现在把-B看作笔的形状(蓝色)并移动你的笔(实际上是沿着P的边界交叉)你得到灰色区域。 (这是P与-B的边界的Minkowski sum。)从P中移除灰色区域,得到Minkowski差异P-B。选择P-B中的任何一点并在那里放置一份B的副本;它将适合P.我为你放了一些副本(橙色)。
<强>实现。强> 您可以通过单独考虑P的每个段s并沿其滑动-B来构建灰色区域。更确切地说,在-s的每个端点上放置-B的副本,并找到构成灰色区域边界的-B的两个副本的切线:
获取每段解决方案并计算P的所有段上的并集。然后从P中减去此并集。查看Clipper以获取可以为您执行此操作的开源库。
你得到的不仅是布尔答案,B是否适合P,而是B的所有有效中心的集合,以一组多边形的形式。也许这对你的应用程序也很有意思。
如果你允许旋转B,那么问题会变得更加复杂。也许你可以使用旋转角度的一些离散化。也许你在机器人运动规划领域找到了一些解决方案。与计算几何中的piano mover's problem相关。
答案 1 :(得分:2)
要求: 你应该拥有两个(PolygonA,PolygonB)凸多边形的所有顶点坐标。
Step1 :将两个凸多边形的所有点都放在一个集合中。
Step2:使用带有新点集的grahamscan查找凸多边形。
Step3:现在你有一个大凸多边形,它将包含两个凸多边形。这意味着你有新创建多边形的顶点,我们称之为PolygonC。
第4步:
如果上述条件不正确,请使用PolygonB重复检查
如果任何Polygon的Above条件不为真,那么没有多边形适合另一个多边形。