1

このトピックに非常に近い質問がいくつかありましたが、実際には役に立ちませんでした。

私はグラフ作成ライブラリをプログラミングしており、ラベルを重ねずに垂直に配置するアルゴリズムが必要です。私はこれに数日間立ち往生しており、最も基本的な機能にそれを蒸留することができました:

Y軸に沿った一連のラベル位置1 1 2 3 5 6 9、たとえば1001 2 3 4 5 6 9

333467234567元の座標に近くなるように重み付けする必要があります。

これは逆方向にも機能する必要があります。値がスケールの上端に集まっている場合は、(オーバーフローする前に) 可能な限り分散する必要があります。

決定的な答えを探しているわけではありませんが、この問題に取り組む方法について助けてください。私は完全に立ち往生しています。

最後に考えたのは、衝突の可能性がないかすべてのラベルをスキャンし、それらをすべての Y 座標の中心に合わせて 1 つの大きなブロックとして配置することでした。ただし、衝突のセットが複数ある場合、これは機能しません。

編集: このアルゴリズムをより大きなコンテキストに入れるには、次の 2 つの Google チャート API 円グラフを見てください。

1)上部に積み重ねられたラベル

2)ボトム スタック ラベル

ラベルはほとんど弾力性があり、結合して全体の質量を質量の中心に移動することで衝突を回避します。

4

2 に答える 2

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 回呼び出していますが、よりインテリジェントに実行する方法を見つけていません)

于 2011-05-01T21:49:33.113 に答える
0

順序付けられたセットに挿入して、ラベルのセットを一意にします。y 軸の上限と下限の差をセット内の要素数で割ります。これが間隔の増分です。セットを順番に繰り返し、間隔の増分ごとに 1 つのラベルを配置します。

スケールを維持する必要があることについては何も言われませんでした...

于 2011-04-27T12:44:02.670 に答える