给定两个凸多边形(可能重叠或不重叠),它们应该以“最严格的方式”布置(使它们不重叠 - 见注释)。 (即它们应该占用尽可能少的屏幕空间。)正式让我们定义“最可能的方式”,使其成为最小区域的边界框(但我也对其他明智的定义持开放态度:) )。 (注意:这里的所有东西都是二维的。)奖励甚至可以考虑边界框边的比例(例如它应该是16:9),但我怀疑要问太多了:)。
有没有比这更好的强力算法呢? (蛮力就像在“每个可能的”方向上铺设它们并计算边界框的面积。)我一直在寻找解决方案,但我没有找到一个;虽然它对我来说并不是一个非常独特的问题...
这就是我现在所做的(仅近似符合上述要求):我修复了一个多边形(p1
)并计算其中心点(c1
)。然后,我发现最近p1
的{{1}}的回旋点(我们称之为c1
)。 (注意:x
向量将定义(c1, x)
的移动方向。)然后,我们将分离轴定义为p2
处的(c1,x)
的垂直线。 (两个多边形将在最后触及x
。)然后我在x
方向上从分离轴计算y p2
(!)的最远点(向量)逆转)!;我们称之为距离(x,c1)
。然后,我d
向p2
方向移动(c1,x)
。
确保d
尽可能接近p2
的中心 - 遗憾的是只考虑p1
。但它并没有考虑p1
的形状,因此可以通过选择不同的位移方向将它们“放得更紧”。
答案 0 :(得分:0)
有趣的问题我会这样做:
将多边形转换为安全距离
almost
触摸并且不重叠ax0,ax1,ay0,ay1
成为一个多边形(最上面的一个)bx0,bx1,by0,by1
是另一个(底部)的边界框ay0<=ay1
,by0<=by1
,向上表示y轴+方向dy = by1 - ay0 + d
dy
是第一个(红色)多边形的平移(只需将其添加到所有y坐标)d
是您想要的安全差距
找到多边形的上半部分和上半部分
dx=x(i)-x(i-1)
dx > 0
它是上半部分的下半部分现在尝试将红色多边形向下移动
min(d,ay1-ay0,by1-by0)
[注释]
dx==0
答案 1 :(得分:0)
由于您未指定包含条件,
如果一个小于另一个,请将其放入较大的多边形内。这是最紧密的:)
否则对齐中心,并旋转其中一个,直到凸包/ BB最小。
修改强>
好的,我稍后阅读了有关非重叠的评论.. :)
所以取一个多边形,并将其所有边与所有其他多边形边重叠,使得区域最小的方向获胜。这绝对是O(2 * N1 * N2)// 2个幻灯片,以匹配每个重叠的顶点。
边的重叠使得多边形的中心仅朝向共享边的相对侧。由于它们都是凸多边形,因此它们不会相交,因此如果其中一个边重叠则不会重叠。