web-dev-qa-db-ja.com

2次元配列にn個の点を均等に分散させて、それらを可能な限り分離するための最も効果的なアルゴリズムは何ですか?

現在マトリックスを使用しているゲーム(私はマップと呼んでいます)をコーディングしようとしています。このマップには、n回生成できる島があります。アルゴリズムの目的は、スペースを利用して島同士が近すぎたり遠すぎたりしないように、島をマップ全体に分散させることです。これは、マップの端に近づけることはできませんが、中央に集中しすぎることはありません。したがって、アルゴリズムの性質はランダムであってはなりません。

アルゴリズムが正しく機能する場合の結果の例を以下に示します。 The matrix is the map and the orange elements represent the islands

偶数の行列に奇数の要素がある場合、奇数の位置にアイランドがあることに注意してください。

3
Ewan Ross

この問題はサークルパッキングと同じだと思います。

非常に多くの島と完全なパッキングが必要でない限り、最も効率的な方法は、位置をハードコードすることです

https://en.wikipedia.org/wiki/Circle_packing_in_a_square

完全にパックされたものと単純な三角パッキングの差が小さくなると、島の数が増えることがわかります。

4
Ewan

Poisson Disk Sampling を調べてみてください。すべてのポイントが一定の最小距離以上離れていることを保証するポイントを生成するためのいくつかのアルゴリズムがあります。これは、レイトレーシングや他のタイプのレンダリングで行う必要のある一般的なことです。たとえば、複数のサンプルを互いに近くに(たとえば、1ピクセルのスペース内で)取得する必要がありますが、サンプルをスペース全体に均等に分散させたい場合です。これはあなたがあなたの島で試みているものに似ているので、それはあなたが実装するのに便利な方法だと思います。

0
user1118321

物理格子を試してください。

各島は、他のすべてのポイントをある程度反発し、他のポイントによってある程度反発するポイントです。距離の影響として反発力を減らします。

効果を合計し、反発効果の一部(たとえば3分の1)だけポイントを移動します。

反復回数を繰り返すか、ポイントが移動しなくなるまで繰り返します。

最後に、すべてのポイントがおおまかに分離され、おおよそ等距離になりますが、多少ランダムに見えるように十分な変動があります。

より多様に見えるようにするには、側面とポイントにわずかに異なる反発力を割り当てます。一部の島は少し近づき、他の島は少し離れます。強さを数ユニットだけ変える必要があります。たとえば、平均は10ユニットで、+-2ユニットだけ変えます。

Amit's Blog をご覧ください。彼はこのような興味深い問題についての記事をたくさん持っています。

0
Kain0_0