2011-09-04 12 views
3

私は内部に100ピクセルのグリッドを持つ500 x 400ピクセルの正方形を持っています。今私はグリッドにスナップする小さなランダムなサイズの正方形でその正方形を埋めるためにしたい。これは、小さい方の正方形が100,200,300、または400ピクセルのサイズであることを意味します。それらのサイズと位置はランダムでなければならないので、実行するたびに出力が異なるように見えます。グリッドをランダムなサイズの矩形に分割します

この画像は、大きな正方形、グリッド、および作成しようとしている小さな正方形の出力を示しています。

Image Test

私はDIVのとルビー/シナトラでこれを生成するんだけど、私は質問が実際に使用するアルゴリズムに対してより一般的であると思います。

最小限のコードでこれを行う方法に関する提案はありますか?

+0

は、有限数がありますそれを置く場所の。あなたがスピードを心配していないならば、いくつかの最大までランダムな正方形のサイズを生成してください。それを置くためのすべての可能な場所を取得します。ランダムに1つを選んで入れてください。可能な場所がない場合は、最大サイズを小さくします。 – Timbits

答えて

1

この方法はたくさんのコードのを取るだろうが、私は、私は正方形のすべて可能な配置を見つけるために、ドナルド・クヌースのダンスリンクアルゴリズム(DLX)(またはいくつかの他のアルゴリズム)を使用しているどうなるのかと思います。事前にアレンジを計算しておけば、後で必要なときに素早く/ランダムに選択することができます。

現在のアルゴリズムと(自分の問題に非常によく似ている)pentominoesのへの応用についての彼の論文を読むことができます:

http://www-cs-faculty.stanford.edu/~uno/papers/dancing-color.ps.gz平方考える

http://en.wikipedia.org/wiki/Dancing_Links

1

単純な再帰的アプローチをとると、かなり良いランダム分布が得られます。ベースケースとして、100x100のグリッドに100x100の正方形を塗りつぶす必要があります。そうでなければ、グリッドが正方形を保持するのに十分小さいいくつかのnのn×nである場合、そのサイズの正方形でタイルすることを選択できます。それ以外の場合は、サイズ100ではない矩形の辺を選択し、100の倍数のランダムな場所を1つ選択し、半分に分割して、両方の半分を再帰的にタイルします。

このアプローチの主な利点は、古い四角形を置く場所を覚えておく必要がないことです。空の矩形で作業し、領域が重複しないように再帰的に問題を細分化します。

これは必ずしも良い結果をもたらすとは限りませんが、コード化するのは非常に簡単です(コードの合計が15-25行であると思われます)。簡単に調整して出力を変更できます。

希望すると便利です。

関連する問題