在2D空间中排列对象的标签而不重叠

时间:2009-05-24 11:35:13

标签: layout geometry 2d overlap

我需要将文本标签附加到随机分布在屏幕上并继续移动的对象上。

标签的默认位置和理想位置位于所引用对象的右侧。我需要一种动态重新排列(或可能合并)标签的方法,以便它们不会相互重叠或与其他对象重叠。

它们应该尽可能地靠近物体,并且不应该,只要物体本身移动平稳,显示任何突然的不稳定运动。

我不知道该怎么做,是否有类似这样的算法?

3 个答案:

答案 0 :(得分:3)

我建议使用物理。使用弹簧将标签贴在物体上,并对每个标签施加排斥力,以避免接近其他物体(及其标签),不包括他们描述的物体。

答案 1 :(得分:0)

贴上标签: 你可以找出最紧密的方块来关闭物体然后从正方形的右侧垂直放置到物体上。将标签放在这个交叉点。

检测碰撞: 存储标签的坐标,在显示最终缓冲区之前,您可以使用坐标检测标签的碰撞。

避免突然移动: 这是困难的部分,因为如果只在检测到碰撞时改变标签的位置,那么就会有一个混蛋。简单的方法是在检测到碰撞时将它们合并,并且只要碰撞存在就合并它们。更难的方法是移动标签。为了使其平滑,您必须事先检测到可能出现在前方某些帧上的任何碰撞,并开始在某些轨迹上移动标签以避免任何碰撞。

答案 2 :(得分:0)

我使用相当强大的力量解决了这个问题

for each object as a
    for each colliding object as c
        if should_swallow(a, c)
            swallow(a, c)

并且在一个循环中多次执行此操作,因为对象在吞下其他对象时会增长,因此必须再次进行碰撞检查(新的重叠可能出现在循环中间)。但是,从来没有超过3个周期,我正在使用的对象数量。

should_swallow()函数根据大小,位置以及之前帧中发生的情况确定是否最好吞下一个对象或被它吞下,以防止闪烁。