【问题标题】:Randomly placing a polygon inside of polygon在多边形内随机放置一个多边形
【发布时间】:2016-01-15 07:11:44
【问题描述】:

我将两个多边形定义为一系列 2D 浮点值。它们不保证是凹的或凸的。他们不越过自己。它们不能旋转。如果可能的话,我想根据它的大小将一个随机放置在另一个内部。主要问题是效率。我必须在几秒钟内完成大约 200 次左右。

我已经研究了几天了,但没有取得明显的进展。任何线索将不胜感激。

【问题讨论】:

  • 你想用这两个多边形做什么?
  • 很抱歉,在标题中指定,从未在正文中添加它。现已更新。
  • 要提出一种有效的算法,我们可能需要更多地了解您要解决的问题,尤其是我们可以依赖的多边形的任何定义特征。
  • 除了定义多边形的典型特征之外并没有什么。至少 3 个点,不跨越自身等。它们的大小和形状基本上是任意的。

标签: algorithm polygon intersection


【解决方案1】:

免责声明: 如果您尝试将多个多边形打包到一个更大的多边形中,那么我认为 this problem is NP hard 因此不太可能开发出高效且精确的算法来解决这个问题。多边形可以在一个平面内连续平移和旋转,这意味着位置可能是无限的,这使得问题的解决空间也是无限的。如果您只是想找出较小的多边形是否可以放入较大的多边形中,我没有一个有效的答案,但正如您所问的那样 - “任何线索都将不胜感激” - 这是一个。支持>


设较大的多边形为B,较小的多边形(要插入的多边形)为S。B共有b个点,S共有s个点。


下图显示了一个边界框和一个最小边界矩形。我们使用它来获得 Fast Fail Filter(非常简单的想法......在下一段中定义)。下面显示的框 (a) 计算速度更快,而框 (b) 的过滤更准确。画出可以为您的案例带来更好投资回报的方框。尽管在下图中,它们都以椭圆而不是多边形为边界,但您明白了。

(图片取自:http://portal.ku.edu.tr/~cbasdogan/Tutorials/imageU21.JPG

症结:如果 B 的任何一条线与 S 的任何一条线相交,或者如果 S 的所有线都在 B 之外,则 B 无法将 S 纳入。

Fast fail filter: 获取 B 和 S 的边界矩形。如果无法将 S 的边界矩形放在 B 的边界矩形内,则您不能将多边形 S 放在多边形 B 内。如果 B 没有机会包围 S,这样您会更快地失败。下图说明了这三种情况。

(图片取自:http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as4/figures/boundcull.gif


预处理: 确定构成 B 的线的方程。将它们存储在 HashMap<<Point, Point>, Line> 中,以便稍后完成。您可以通过斜率 m 唯一地定义线并截取 c 并且线的端点将成为关键(<Point, Point> ) 的 HashMap。


算法:

对于通过上述过滤器的每个 S:

  1. 读取 S 的点并确定构成 S 的线
  2. 对于 S 的每一行,看它是否与 B 的任何一行相交(它们已经存储在 HashMap 中)
  3. 如果没有交叉点,S 在 B 里面,你只需要画线,不用担心交叉点。

在最坏的情况下,这个算法的复杂度将是 O(bs) 用于绘制每个多边形。


此步骤是蛮力编写的,以使算法易于理解。否则,可以在这里进行更快地给出结果的关键优化。您可以过滤 B 的线。如果 B 的线的端点在 S 的最左点的左侧,或者在 S 的最右点的右侧或上方,则不需要考虑与 S 相交的 B 线S或S以下。这样可以节省很多计算。

【讨论】:

  • 我认为您可能误解了这个问题,该问题显示为“我有 两个 多边形定义为一系列 2D 浮点值。”您仍然可以以某种方式使用您的算法(例如,生成一堆随机旋转和平移的多边形 S,并找到第一个通过过滤器的版本),但作者可能追求更有效的算法。
  • @MichaelPetito:你是对的。我正在查看是否仍然可以编辑和回答问题。如果没有,我将删除我的答案。
  • 我不会删除您的答案,因为它可能提供合理的替代方案或有用的。
  • @MichaelPetito:修改了文本以保持其有用性,并在顶部添加了有用的免责声明。再次感谢您指出错误。
【解决方案2】:

如果这里的其他答案有用,这是它的附录。它展示了另一种查看较小多边形是否在较大多边形内的方法。

要测试多边形包含,您会查看多边形的所有边是否都包含在内。要测试所有边,请测试是否包含每条边的所有点。

  1. 通过在现有顶点之间添加顶点致密较小的多边形。下图显示了一条线的致密化。
  2. 现在对于致密多边形,测试它的点是否都位于外部多边形内。这个测试可以通过从两边的点画线到无穷远,然后计算这条线与更大的多边形相交的次数来完成。
  3. 如果所有点都在范围内,则多边形在范围内。

First Image source.

Second Image source.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-03-21
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多