2011-04-27 65 views
1

有几个问题非常接近这个主题,但没有一个真正帮助我。将一系列值分隔开,以便它们不重叠

我一直在编程一个图形库,我需要一个算法来垂直放置标签而不重叠。我已经坚持了几天,并设法将其提取到最基本的功能:

如果沿着Y轴给出一系列标签位置,比如说1 1 2 3 5 6 9,以及一个上部和一个下限100分别我需要一种方法来空间出来的值,以输出1 2 3 4 5 6 9

333467234567加权以接近原始坐标。

这也应该向后工作,如果值在规模的上端揉成,就应该我不是在寻找一个明确的答案蔓延尽可能(溢出之前)

,但我想就如何解决这个问题提供一些帮助。我完全卡住了。

最后一种思路是扫描所有可能发生碰撞的标签,并将它们定位为一个大块,并对齐到所有Y坐标的中心。但是如果有多组冲突,这将不起作用。

编辑:为了把这个算法在更大的背景下,看看这两款谷歌图表API饼图:

1)Top stacked labels

2)Bottom Stacked Labels

标签几乎弹性,他们通过连接在一起并将整个质量移动到质量中心来避免碰撞。

回答

0

那么从其他来源的一些思考和建议,我想出了一个解决方案后:

伪代码:

foreach labels as label 
    if label->collidesWith(labels->lowerLimit) 
     label->moveAwayFrom(labels->lowerLimit) 

    if label->collidesWith(labels->upperLimit) 
     label->moveAwayFrom(labels->upperLimit) 

    if label->collidesWith(label->previous) 
     label->moveAwayFrom(label->previous) 
     label->previous->moveAwayFrom(label) 

    if label->collidesWith(label->next) 
     label->moveAwayFrom(label->next) 
     label->next->moveAwayFrom(label) 
endforeach 

MoveAwayFrom一次移动1个像素。当这个函数运行多次时,它会重新调整标签,直到它们没有碰撞。 (实际上我把这个循环调用了100次,没有想到更有意义的方法)

+0

如果有人想看看实际的代码,该项目被称为mSVG和它的github – 2011-05-01 22:14:24

0

通过插入到有序集合中来使得标签组唯一。将y轴上下边界之间的差值除以集合中元素的数量。这是你的间距增量。按顺序迭代整个集合并为每个间距增量放置一个标签。

你没有说需要保持一个规模什么...

+0

不,我不需要保存比例,但如果可能的话,我确实需要保留原始位置。即,如果有两个不重叠的标签,他们应该采取他们的首选位置 – 2011-04-27 15:57:53

相关问题