微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

制作平面上最外圈的列表

如何解决制作平面上最外圈的列表

我有一个装满圆圈的大矩形。这些圆可能彼此重叠,但它们都具有相同的直径。我需要找到“边界”圆圈。如果这些边界圆之间有间隙 - 并且间隙大于圆的直径 - 也应该包括里面的那个。 这里有些例子:

enter image description here

enter image description here

enter image description here

我需要做的是使这些外圆不可移动,这样当内圆移动时 - 它们永远不会退出矩形。它是如何制作的,是否有任何已知的算法用于此类事情?我是用 TypeScript 做的,但我想,任何命令式语言解决方案都可以应用

解决方法

这可能太保守了,但肯定不会放出任何磁盘。

  1. 在圆心上计算 Delaunay triangulation。高质量的库是最好的,因为退化的情况和浮点测试很难正确。

  2. 在平面对偶上使用深度优先搜索,找到所有可从无限面到达的面,这些面仅穿过长度大于(或等于?取决于这些是闭合圆盘还是开圆盘)两次的边直径。

  3. 入射到这些面的所有点都对应于外部圆盘。

,

我不太确定我是否能回答您的问题,但我使用 Tinfour Delaunay Triangulation 库(用 Java 编写)汇总了两个快速示例。我不得不手动将你的分数数字化,所以我并没有在所有情况下都达到中心。

第一张图显示了 Delaunay 三角剖分的边界是一个凸多边形。这很容易构建,只需将顶点(圆心)添加到 Tinfour 的 IncrementalTin 类,然后询问边界多边形。几乎所有的 Delaunay 库都会支持这一点。所以你不一定需要 Tinfour。

enter image description here

问题在于,这可能包括对您的内部圈子无效的区域。我玩了一些将凹度引入边界多边形的方法。正如你在下面看到的,右下角的顶点必须完全被砍掉(如果我明白你在找什么)。然后我遍历周边边缘并引入凹面,其中每个外边缘对面的顶点是一个“保护”顶点。

enter image description here

我为此编写的代码非常混乱。但如果这就是你要找的东西,我会尽量把它清理干净并张贴在这里。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。