Axis Aligned Spatial Division:スペースをランダムな長方形に分割しますか?


11

3Dスペースをランダムな軸で整列したボックスの形状に分割する方法が必要です。とりあえず、テストのために2Dスペースを分割しています。私が思いついた最も直接的なアプローチは、サイズ(1、1)の長方形を定義し、既存のすべての長方形をX軸とY軸が交互に並ぶ2つの不均一な長方形に再帰的に分割することでした。

ここに画像の説明を入力してください

ここでの問題は明白です。このアプローチでは、長いストレッチ線(赤でマーク)が発生します。

ここに画像の説明を入力してください

私が望むのは、もっと有機的な見た目です(私は例を含めました)

見てください、上から下へ、または左から右への長い直線はありません。

ここに画像の説明を入力してください

唯一の制約は、サイズの粒度に影響を与えずに、長方形の最小サイズを制限したい場合があることです。つまり、最小の四角形が秒より1平方センチメートル小さい場合、最小の部屋は2平方単位であってはなりません。

したがって、理想的には、アルゴリズムは次の3つの制約すべてを満たす必要があります。

  1. 長方形は無限に小さくはありません。
  2. 四角形のサイズは、最小の四角形のサイズの離散的な乗算ではありません。つまり、最小の長方形が3平方単位である場合、大きい長方形は6、9、12などの正方形単位に制限されず、代わりに3.2または4.7になります。
  3. アルゴリズムは多項式時間で実行されます(高速で計算する必要があります)。

回答:


12

概説するアプローチはシンプルで便利ですが、図のようにひどいアーティファクトが発生します。それを避けなさい。並列成長アルゴリズムが必要です。シングルスレッドモデルの場合、ラウンドロビンアプローチは次のとおりです。

  1. マップ空間にさまざまなポイントをランダムに配置します。使用(醜いクラスタリングを回避する)、その分布を正規化ガウス分布又はに従って、互いに離れるランダムに配置された点を移動させるために反復緩和アルゴリズムを適用することによってロイド緩和のためのボロノイ図を。これらのポイントは、予定の部屋の重心を表します。
  2. (すべての部屋に対して並列/繰り返しラウンドロビン)各ポイントから、グローバル反復ごとに中心点から移動しながら、4つの頂点を外側に拡大します(長方形の部屋)(各部屋で同じではなく、異なる速度で異なる部屋を成長させることができますすべて、そしてこれがどのように行われるかを見てください-おそらくより有機的で多様な結果が得られるでしょう)。ある時点で、長方形のいくつかが互いに押し付け始めます。その時点で、その軸の成長を制限し、2つの部屋の隣接するエッジが正確に接触していることを確認して、次に進みます。
  3. 手順2を繰り返して、すべての部屋が隣接する部屋またはマップの境界によって制限されるまで、すべての部屋を段階的に成長させます。
  4. これはまだいくつかの空のスペースを残します。現在、問題は、占有されていないスペースから部屋を見つけて作成することの1つになっています。実際、基礎となるスペースが(整数でインデックス付けされた)グリッドである場合(およびすべての成長の反復がそのグリッドにスナップする場合)、占有および非占有グリッドセルのリストを維持できるため、これは処理がはるかに簡単です。すべての部屋を配置して拡大したら、空いているリストを検索して、隣接するセルのグループで構成される個別のスペースを探します。未使用のスペースの多くは非長方形の形状になるため、その非長方形のスペース内からランダムにセルを選択し、手順2で部屋を作成したときと同じように、セルを最大サイズに拡大する必要があります。 -長方形のスペース、完全に満たされるまで。
  5. マップが100%占有されるまで、手順4を繰り返します。

これは良いアドバイスです。不利な点は、非常に小さな四角形から私を保護するために何もしない可能性があることです。長方形の大きさを制限する方法が必要です。現在、私は別の方法に取り組んでいます。結果を比較して更新します。
AturSams 2014年

@ArthurWulfWhite次に、あなたの質問は十分に指定されておらず、更新する必要があります。部屋の最小サイズは、マップセルの解像度によって決まります。そのため、最小の部屋サイズに対応するのに十分な粗粒度にした場合、その後、浮動小数点ベースで軸を調整して、より有機的な外観を返すことができます。
エンジニア

あなたは正しいです!その部分を書いたと思った。しかし、私はしていません。この誤りをお詫び申し上げます。はい、グリッドのサイズを知っています。部屋は、グリッドが許す限り小さくすることができます。
AturSams 2014年

わかりました-適切な解決策を見つけてください。ところで、「軸の調整」ではなく「グリッド線の調整」を意味しました。
エンジニア

1
実際、私はあなたが私に考えた概念に基づいて、大まかにそのようなことをやっています。ここにも結果を掲載します。
AturSams 2014年

2

ご覧のとおり、私はなんとかこれらのアーティファクトを取り除きました。考え方は非常に似ています。

  1. 2Dスペースを不均一なグリッドに分割します。2本の線が近すぎる場合は、1本を削除します。
  2. 長方形をランダムに選択し、それがaxis-y(高さ)で変更されているかどうか、および直接隣接するものがaxis-yで変更されているかどうかを確認します。私はどちらも変更されていません。それらの間のセグメントを再交渉してもらいます(一方はもう一方にスペースを提供します)。
  3. 今回はもう一方の軸でのみ、ステップ2と同じことを行います。
  4. できるだけ多く変更するまで、このプロセスを繰り返します。

不均一グリッド(1):

ここに画像の説明を入力してください

軸xでの交渉(2):

ここに画像の説明を入力してください

y軸での交渉(3):

ここに画像の説明を入力してください

結果(4):

ここに画像の説明を入力してください

ここに画像の説明を入力してください


これは、@ Nick Wiggillからの洞察に緩く触発されました
AturSams

2
これをさらに改善するには、まずn * m個の隣接セルのグループを1つの長方形にランダムにマージします。これにより、上記の出力に表示されている基になるグリッドがマスクされます。これらの大きな四角形とのネゴシエーションは、エッジの1つに沿ったすべてのセルで機能する必要があります。
DMGregory

OK。まだ非常に多くの同一直線上の境界があります。私はそれらにさらに取り組みますが、あなたがあなたの解決策を見つけたのは良いことです!喜んでお手伝いします。
エンジニア

@DMGregory私はこれを検討しましたが、小さな四角形と大きな四角形の比率がある程度一定になるようにしました。これがテクスチャまたはレベルである場合、私は間違いなくそれを行います(実際にそれを行う前の例があります)。
AturSams 2014年

@NickWiggill同一直線上にある線を完全に取り除くことができます。アルゴリズムを調整するだけです。さらに改善する方法が必要です(最新のバリエーションで更新)
AturSams
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.