2011-04-27 29 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

相關問題