4

円グラフを描画しようとすると問題が発生します。 設計例

もちろん、グラフを描くのは問題ありませんが、問題はアイコンの配置です。理想的には、アイコンは円の上に配置する必要があります (ここでは、パーセント ラベルは忘れましょう)。

ただし、小さな値を持つ隣接項目がある場合、設計は明らかに壊れます。

実装例

この問題を解決するアルゴリズムをお勧めできますか? 簡単にするために、入力として次のものがあります。
PIE_RADIUS- パイの外側の半径。
ICON_RADIUS- アイコン円の半径。
ICON_PLACEMENT_RADIUS- アイコンの中心を理想的に配置するときの円の半径。
NUM_ICONS- 配置するアイコンの数。
iconAnglesセクションの中心での各アイコンの角度

必要な出力:
iconAnglesの周りに配置されたアイテムの場合、またはiconPositionsアイコンを理想的な円から移動する場合。

2 つのアイコンが重なっているかどうかを確認する方法を知っています。円の中心は にあると考えることができます(0, 0)

(実装は iOS アプリケーションの一部ですが、一般的なアルゴリズムに興味があります)。

4

3 に答える 3

1

ただブレインストーミング:

オーバーラップに対する高いペナルティと、各候補位置とその理想的な位置 (そのスライスに対して中心) との間の角距離の 2 乗の合計に等しいペナルティを持つフィットネス関数を使用する遺伝的アルゴリズム。

于 2013-04-03T18:17:18.407 に答える
0

私が実装した解決策は次のとおりです。

  1. スライスに対するすべてのアイコンの位置を計算します (アイコンの中心はICON_PLACEMENT_RADIUS)
  2. 重複するアイコンのシーケンスを見つけます (アイコンを繰り返し、次のアイコンが前のアイコンと重複しているかどうかを確認します)。
  3. 2 つのアイコン間の最小角距離を計算します (約(2.0f * ICON_RADIUS + 1.0f) / ICON_PLACEMENT_RADIUS)
  4. シーケンスの中心を計算し (シーケンスのすべてのスライスを合計して中心を見つけます)、アイコンをまとめて配置します (それらの間の距離は最小角距離です)。
  5. すべてのアイコンが配置されたら、アイコンが重複しているかどうかを確認し、重複している場合は、それらのシーケンスをマージして繰り返します。

このアルゴリズムは、すべてのアイコンの数が円のサイズに比べて小さい場合にのみ機能しますが、シンプルで非常に高速です。

結果は次のとおりです。
ここに画像の説明を入力

于 2013-04-03T18:45:00.067 に答える