私はこのブラウザベースの実験に取り組んでおり、N個の特定の円が与えられ(それらに一意の画像があるとしましょう)、それらを一緒に配置する必要があり、それらの間に可能な限り小さなスペースを残す必要があります. 円状に配置する必要はありませんが、一緒に「クラスター化」する必要があります。
円のサイズはカスタマイズ可能で、ユーザーは JavaScript スライダーをドラッグしてサイズを変更し、いくつかの円のサイズを変更できます (たとえば、スライダーの 10% では、円 4 の半径は 20px、円 2 は 10px、円は円になります)。 5 は同じままなど...)。すでにご想像のとおり、スライダーが移動しているときに、サイズ変更と再配置をスムーズに「移行」しようとします。
私がこれまでに試したアプローチ: 手動で配置しようとする代わりに、物理エンジンを使用しようとしました-
アイデア:
- 画面の中央にある種の引力を配置する
- 物理エンジンを使用してボールの衝突を処理する
- 「ドラッグ ザ タイム」スライダー イベントでは、さまざまなボール サイズを設定し、残りはエンジンに任せます。
このタスクでは、「box2Dweb」を使用しました。画面の中央に引力を置いたのですが、ボールが中央に配置されて浮き上がるまでに非常に時間がかかりました。次に、小さな静的なボールを中央に配置して、ボールにぶつかって停止するようにしました。次のように見えました。
結果は少し良くなりましたが、円は静止する前にしばらく動いていました。ボールの摩擦やさまざまな引力などの変数をいじった後でも、全体が浮いていて、非常に「グラグラ」しているように感じましたが、タイム スライダーをドラッグしたとき (サイズが変わったとき) にのみボールを動かしたかったのです。さらに、box2d ではオブジェクトのサイズを変更できないため、回避策としてハックする必要があります。
そのため、box2d のアプローチにより、これを処理するために物理エンジンをそのままにしておくことは、問題の最善の解決策ではないことに気付きました。あるいは、私が思いもよらなかった他の力を含めなければならないかもしれません。StackOverflow で、この同様の質問を見つけました。ただし、非常に重要な違いは、n 個の不特定の円を「一度に」生成するだけで、特定のボールのサイズと位置をさらに操作できないことです。
私は今本当に立ち往生しています。誰もこの問題に取り組む方法を知っていますか?
更新: ほぼ 1 年が経ちましたが、このスレッドのことを完全に忘れていました。私が最後にしたことは、物理モデルに固執し、ほとんどアイドル状態で力をリセット/停止することです。結果はここで見ることができますhttp://stateofwealth.net/ あなたが見る三角形はそれらの円の中にあります. 残りの線は「ドロネー三角形分割アルゴリズム」を介して接続されます