3

画面全体にランダムに広がり、動き続けるオブジェクトにテキストラベルを付ける必要があります。

ラベルのデフォルトの理想的な位置は、それが参照するオブジェクトの右側です。ラベルが互いにまたは他のオブジェクトと重ならないように、ラベルを動的に再配置(または場合によってはマージ)する方法が必要です。

オブジェクト自体がスムーズに動く場合は、オブジェクトにできるだけ近づけて、突然のぎくしゃくした動きを見せてはなりません。

どうすればいいのかわかりませんが、このようなアルゴリズムはありますか?

4

3 に答える 3

3

物理学を使用することをお勧めします。バネでラベルをオブジェクトに貼り付け、すべてのラベルに反発力を加えて、説明しているオブジェクトを除く他のオブジェクト(およびそのラベル)に近づかないようにします。

于 2009-05-24T11:44:59.977 に答える
0

私はかなりブルートフォースを使用してこれを解決しました

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

オブジェクトは他のオブジェクトを飲み込むと成長するため、これをサイクルで数回実行します。そのため、衝突チェックを再度実行する必要があります(サイクルの途中で新しいオーバーラップが表示される場合があります)。ただし、作業しているオブジェクトの数を使用して、3サイクルを超えてヒットすることはありません。

should_swallow()関数は、サイズ、位置、およびちらつきを防ぐために前のフレームで何が起こったかに基づいて、オブジェクトを飲み込むのが良いのか、それとも飲み込むのが良いのかを判断します。

于 2009-07-20T22:20:19.260 に答える
0

ラベルを貼る:オブジェクトを閉じる最もきつい正方形を見つけて、正方形の右側からオブジェクトに垂線を落とすことができます。この交点にラベルを配置します。

衝突の検出:ラベルの座標を保存します。最終バッファーを表示する前に、座標を使用してラベルの衝突を検出できます。

突然の動きを避ける:衝突が検出されたときにのみラベルの位置を変更すると、ジャークが発生するため、これは難しい部分です。簡単なアプローチは、衝突が検出されたときに、衝突が存在する限り、それらをマージすることです。より難しいアプローチは、ラベルを移動することです。これをスムーズにするには、フレームの前方に表示される可能性のある衝突を事前に検出し、衝突を回避する軌道上でラベルの移動を開始する必要があります。

于 2009-05-24T11:47:06.323 に答える