【问题标题】:How to find an arbitrarily oriented minimum bounding box in c++如何在 C++ 中找到任意方向的最小边界框
【发布时间】:2011-03-15 11:53:40
【问题描述】:

假设我有 N 对正长坐标(点)的列表。
如何找到包含所有这些矩形的最小矩形?
矩形还可以具有浮动坐标,可以任意角度旋转并进一步缩小……不仅仅是 X、Y、宽度和高度!

我已经知道如何找到最小的多边形或未旋转的矩形,但这不是我需要的……我想知道如何找到任意方向的最小边界框。

【问题讨论】:

  • “向量合成算法”听起来像是 CSI:Miami 中的东西:P
  • 哇。很好,但我认为他们不会为我找到任何实际用途......
  • Code Golf 有一个类似但不完全相同的问题,您也许可以适应。
  • @kojiro 不,它甚至不符合我的需要。
  • @Vercas:它必须有多“完美”? “接近最佳”可以吗?

标签: c++ geometry


【解决方案1】:

http://www.geometrictools.com/Source/ComputationalGeometry.html

“最小面积框”部分有各种示例。

例如

计算一个包含指定点的最小面积导向框。 该算法采用旋转卡尺法。

https://www.geometrictools.com/Samples/Geometrics.html#MinimumAreaBox2D

https://www.geometrictools.com/GTE/Mathematics/MinimumAreaBox2.h

【讨论】:

  • 谢谢!该文件只包含我需要的功能!我还在那个网站上找到了更多我需要的东西!
  • 我知道它确实如此,因为我今天早上自己使用了它。找到正确的术语是成功的一半!
  • 好吧,我明白你的意思了......即使谷歌没有;)
  • 从描述来看,这似乎不准确。一个真正的最小面积框很可能有一个不是点的平均值的中心。他们似乎正在使用捷径来获得非常接近的东西。
  • @Vercas:这不会计算最小框。正确答案由“旋转卡尺”给出。 cgm.cs.mcgill.ca/~orm/rotcal.html
【解决方案2】:

wikipedia page 指出,您可以通过使用最小矩形必须具有与凸包的边缘之一共线的边缘来解决此问题。

【讨论】:

  • 维基百科页面不包含算法;它链接到的“旋转卡尺”页面确实包含算法,但不适用于这个问题。一些实际链接:cgm.cs.mcgill.ca/~orm/maer.htmlgoogle.com/codesearch/…。请注意,这种方法适用于“最低”的任何合理定义;特别是它适用于“最小面积”和“最小周长”;这两者经常重合,但并非总是如此。
  • 谢谢 Gareth(你好!)我已经更改了答案的措辞。
  • 对于凸包中的每个线段,可以使用它计算边界矩形的面积,并选择最小的。不过,它在船体上的点数上运行 O(n^2)。
  • 嗨,保罗。我认为这可能是同一个保罗汉金:-)。托马斯,如果你做对了,一旦你得到了凸包,它实际上会变成 O(n)。例如,请参阅我上面评论中的第一个链接。
【解决方案3】:

【讨论】:

  • 不幸的是,它没有帮助。
  • 这篇论文解决了寻找边界正方形的难题。如您所见,复杂度为 O(N²Log(N)),而边界矩形在 O(N Log(N)) 中很容易获得。
【解决方案4】:

我不知道这是否对你有帮助,但这是我对如何解决这个问题的想法。

您需要函数来找到“最角落”的点(在您的示例中,左侧 2 点和右侧 2 点)。给定这 4 个点,用线将它们连接起来。

(请注意,在您的示例图像中,生成的矩形不会包含顶点,所以...) 然后,您需要一个函数来确定生成的矩形是否包含所有给定的点;如果不是,则将端点(在本例中为生成的矩形的前 2 个点)扩展 N (这是一个单一的度量值......比如说一个像素,或者如果你很聪明,则到该点的距离边界加/减一个取决于方向)并重新评估。

【讨论】:

  • 好点;在这种情况下,您需要导出表示两点之间连接的函数 (y=mx+b),然后沿着该路径继续 - 沿着原始矩形的两侧。
【解决方案5】:

也许这对你有用:

  • 找到所有点的中心点(所有 x 的总和 / x 的数量,y 相同)
  • 取离中心最远的点作为角点
  • 通过与角点成 90° 角的第二远点的投影线
  • 遍历中心点另一侧的点并找到最小值

【讨论】:

  • 第 3 步和第 4 步非常混乱,对我来说毫无意义
猜你喜欢
  • 2014-01-11
  • 2014-07-17
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多