【发布时间】:2014-11-02 04:39:52
【问题描述】:
给定两个凸多边形(可能重叠也可能不重叠),它们应该以“最紧密的方式”布局(使它们不重叠 - 参见 cmets)。 (即它们应该占用尽可能少的屏幕空间。)正式地,让我们将“最紧密的可能方式”定义为边界框具有最小面积的方式(但我也对其他合理的定义持开放态度:) )。 (注意:这里的一切都是 2D 的。)一个好处是甚至考虑边界框的边的比例(例如,它应该是 16:9),但我怀疑问得太多了:)。
是否有比蛮力更好的算法来做到这一点? (蛮力就像将它们布置在“所有可能的”方向并计算边界框的面积。)我一直在寻找解决方案,但我还没有找到;虽然这对我来说不是一个非常独特的问题......
这就是我现在所做的(仅接近上述要求):我将一个多边形固定 (p1) 并计算其中心点 (c1)。然后我在p1 的抑扬符上找到最接近c1 的点(我们称之为x)。 (注意:(c1, x) 向量将定义p2 的移动方向。)然后我们将分离轴定义为与(c1,x) 在x 处垂直的线。 (这两个多边形最后会在x 接触。)然后我计算 y,它是p2(!) 在(x,c1) 方向上离分离轴最远的点(矢量反转!);让我们称它的距离为d。然后我将p2 向(c1,x) 的方向移动d。
它确保p2 尽可能靠近p1 的中心 - 不幸的是,仅限于p1。但它没有考虑p2 的形状,因此可能通过选择不同的位移方向将它们放置得“更紧”。
【问题讨论】:
-
“layed out”意味着它们不会在新位置重叠,对吧?
-
你在使用任何框架吗?有一些算法和索引可能能够为您处理其中的一些,或者至少大大提高速度。
-
@japreiss:是的,我就是这个意思
-
边界框可能无法给出正确的图片。紧密对齐的多边形集可能有更大的 AxisAligned BB.... 凸面外壳可能更适合该法案
-
@radpin:不,但如果有帮助的话我可能会(目前是准系统 Javascript)——你认为什么样的框架?
标签: math graphics geometry polygon computational-geometry