2

たとえば、制限されたスペースが 100 x 100 x 100 の大きさで、各ボールの半径が 5 の場合、このスペース内のランダムな位置にこれらのボールを 100 個生成する必要があり、重複は許可されません。私は2つのアプローチを考え出します:

  1. srand を使用して 100 個の位置を取得し、重なっているボールを削除するチェック (2 つのボールの中心の距離が半径の 2 倍未満であるかどうかのチェック) を実行し、別の x 個のボール (x はボールの数) を生成します。 100 個のボールが重ならなくなるまでこのプロセスを繰り返します。

  2. 最初にスペースを 100 個の立方体に分割し、 を使用して割り当てられた立方体内に各ボールを配置srandします。このようにして、ボールがまったく重ならないようにします。

ランダムに関しては最初の方法の方が適切だと思いますが、時間がかかりすぎて、2番目の方法は高速で簡単ですが、ランダムのアイデアについてはわかりません。このモデルは、空気中の分子の位置をシミュレートしようとしています。どちらも良い方法ではないかもしれませんが、良い方法があれば教えてください。前もって感謝します!

編集: @Will は、元の最初のアプローチよりも似ていますが、はるかにクリーンなオプションを提供してくれます。新しいボールを追加するたびに、既存のボールと重複しているかどうかを確認し、重複している場合は再生成します。複雑さは 1+2+3...+(n-1) で、約 O(n^n) です。しかし、より高速なアルゴリズムがあるかどうかはまだ疑問です。

Edit2: 申し訳ありませんが 1+2+..n は n^2 である必要があります

4

3 に答える 3

1

球体の体積は空間の体積の約 1/1900 であるため、ランダムな位置を選択して重なりをチェックするだけであれば、多くを再生成する必要はありません。また、本当に 100 個しか必要ない場合は、オクトリーのような高度なアルゴリズムを使用して衝突をチェックするのは無駄です。

もちろん、コードを作成するとすぐに、誰かが 100 個ではなく 10,000 個の球体でそれを行うように要求するので、今言ったことはすべて間違っているでしょう。

ランダムに選んだ立方体にそれらを入れるという Chris の提案が気に入っています。おそらく最も現実的ではありませんが、近くてはるかに単純です。

于 2013-07-16T08:12:58.913 に答える