如何最佳地取代两个多边形?

时间:2014-09-08 21:01:53

标签: math graphics geometry polygon computational-geometry

给定两个凸多边形(可能重叠或不重叠),它们应该以“最严格的方式”布置(使它们不重叠 - 见注释)。 (即它们应该占用尽可能少的屏幕空间。)正式让我们定义“最可能的方式”,使其成为最小区域的边界框(但我也对其他明智的定义持开放态度:) )。 (注意:这里的所有东西都是二维的。)奖励甚至可以考虑边界框边的比例(例如它应该是16:9),但我怀疑要问太多了:)。

有没有比这更好的强力算法呢? (蛮力就像在“每个可能的”方向上铺设它们并计算边界框的面积。)我一直在寻找解决方案,但我没有找到一个;虽然它对我来说并不是一个非常独特的问题...


这就是我现在所做的(仅近似符合上述要求):我修复了一个多边形(p1)并计算其中心点(c1 )。然后,我发现最近p1的{​​{1}}的回旋点(我们称之为c1)。 (注意:x向量将定义(c1, x)的移动方向。)然后,我们将分离轴定义为p2处的(c1,x)的垂直线。 (两个多边形将在最后触及x。)然后我在x方向上从分离轴计算y p2(!)的最远点(向量)逆转)!;我们称之为距离(x,c1)。然后,我dp2方向移动(c1,x)

确保d尽可能接近p2的中心 - 遗憾的是只考虑p1。但它并没有考虑p1的形状,因此可以通过选择不同的位移方向将它们“放得更紧”。

2 个答案:

答案 0 :(得分:0)

有趣的问题我会这样做:

  1. 将多边形转换为安全距离

    • 计算边界框
    • 翻译一个多边形,使边界框almost触摸并且不重叠
    • ax0,ax1,ay0,ay1成为一个多边形(最上面的一个)
    • 的边界框
    • bx0,bx1,by0,by1是另一个(底部)的边界框
    • ay0<=ay1by0<=by1,向上表示y轴+方向
    • 所以dy = by1 - ay0 + d
    • 其中dy是第一个(红色)多边形的平移(只需将其添加到所有y坐标)
    • d是您想要的安全差距 bbox translation
  2. 找到多边形的上半部分和上半部分

    • 喜欢这张图片: polygon y-halves
    • 按CW排序Vertexes
    • 然后计算每个顶点dx=x(i)-x(i-1)
    • 如果dx > 0它是上半部分的下半部分
  3. 现在尝试将红色多边形向下移动

    • 您必须检查顶部多边形的底部
    • 底部多边形的顶部
    • 这应该可以加快速度
    • 移动步骤应该是min(d,ay1-ay0,by1-by0)
    • 的一小部分
    • 现在只需逐步移动顶部多边形
    • 如果相邻的一半之间没有交叉点重复最后一步
    • 否则通过安全间隙向上移动顶部多边形&gt;步骤,这是解决方案
  4. [注释]

    • 你应该处理边界情况,例如边界框不重叠(并排)
    • 处理线条作为交叉点
    • 您可以尝试两种变体(多边形是第一个,哪个是第二个)并选择更好的解决方案
    • 可能更安全,在展位上下两半都有顶点dx==0

答案 1 :(得分:0)

由于您未指定包含条件,

如果一个小于另一个,请将其放入较大的多边形内。这是最紧密的:)

否则对齐中心,并旋转其中一个,直到凸包/ BB最小。

修改

好的,我稍后阅读了有关非重叠的评论.. :)

所以取一个多边形,并将其所有边与所有其他多边形边重叠,使得区域最小的方向获胜。这绝对是O(2 * N1 * N2)// 2个幻灯片,以匹配每个重叠的顶点。

边的重叠使得多边形的中心仅朝向共享边的相对侧。由于它们都是凸多边形,因此它们不会相交,因此如果其中一个边重叠则不会重叠。

Slides at vertices