【问题标题】:Efficient convex hull around rectangles (and checking if a point lies within the hull)矩形周围的高效凸包(并检查点是否在包内)
【发布时间】:2015-03-29 17:31:30
【问题描述】:

如果我知道我的点总是排列成两个矩形,是否有一种优化的方法来获得凸包?

我编写了经典的凸包算法(仅通过枚举所有点),但由于我有一堆矩形对,因此我正在徘徊,是否有针对这种特殊情况的更有效的方法。

这就是我要说的,澄清一下:

我尝试以各种方式对点进行排序,但我找不到优化它的一般规则。基本的凸包算法也是处理这种情况的最有效方法吗?

更新

为了阐明我的最终目标,我已经将大约 100 个矩形分成两组,以及数千个点,我必须实时检查它们是否位于每个凸包内。现在我已经考虑过了,我猜凸包部分不会成为整个操作的瓶颈(但仍然有大约 100 个,我的目标是实时 60fps 处理),所以我可能以及使用@BartKiers 建议的普通算法,然后在分析后返回。

我会暂时搁置这个问题,也许有人有一个优化的想法,无论如何可能有用。

【问题讨论】:

  • 可能有更快的解决方案,但我怀疑您是否需要它们:您总是在 8 点上执行算法,对吧?手动对点进行排序将产生与正确实现的凸包算法几乎相同的运行时间。
  • @Bart:谢谢,是的,总是在 8 个点上,但是有大约 50 对这样的矩形(100 个矩形组合成对),我需要检查某个点是否位于每个点内凸包 - 与所有这些包相比,我有数千个这样的点需要实时检查(我用简单的边界框修剪了大部分点,但还有很多需要检查)。

标签: algorithm convex-hull


【解决方案1】:

如果我是对的,您可以枚举所有相关配置,注意如果一个矩形的左侧比另一个矩形的左侧更靠左,那么它的两个左顶点在凸包上。

根据四个基本方向的相同推理,您可以硬编码 16 种不同的情况。

另一种看待它的方法是观察凸包是两个矩形中最紧密的边界框,有 0、2 或 4 个角被“切断”。找到边界框很简单,当一个角不属于任何矩形时,您决定是否要切割它。

您可以轻松地从该规则推导出点包含测试。如果您已经有边界框测试,则添加角点测试就足够了。

【讨论】:

  • 谢谢!虽然我不知道你是怎么弄到 16 箱的? :)
  • 如果你的目标是检查一个点的内部,你甚至不需要显式地构建 CH,只需检查该点是否在每条边的好的一侧(其中 4、6 或 8 )。
  • 非常感谢,这真的很有帮助!
猜你喜欢
  • 2015-10-02
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2014-04-02
  • 2012-01-05
  • 2012-03-24
  • 2019-09-05
相关资源
最近更新 更多