物理シミュレーション用のシーンを作成してみます。シーンは、長方形の池に浮かぶ長方形のフロックで構成されています。このようなもの:
したがって、長方形の領域を、指定された範囲の幅と高さの交差しない回転した長方形で埋める必要があります。その地域の最適なカバレッジを見つける必要はありません。目標は、交差することなく、異なるサイズのフロックを生成することです。
そして、衝突検出アルゴリズムのみを使用して、ダイナミクスなしでソリューションを取得したいと思います。
四角いバケツに落ちる箱のコレクションをシミュレートし、すべての箱が静止したらその位置を保存することを検討できます。
box2d
は、これを実行できるオープンソースの2D物理ライブラリです。AngryBirdsや1千万のFlashゲームの背後にある物理エンジンとして認識されているかもしれません。
私がすることは次のとおりです。
長方形の長さが [MaxSize MinSize] の間であるとします。
r <- MaxSize
do{
Trying adding non-intersecting circles to the area with radius r and random center (x,y). We use circle instead of rectangle because intersection detecting for circles are easier than rectangles. e.g. if distance(x,y,x',y')<r+r' then we are good.
If adding circle failed{
r--;
if r< MinSize break;
}
}
これで、交差する正方形でいっぱいの平面ができました。交差点の検出に円を使用していたため、ギャップが生じます。これで十分でない場合は、正方形を長方形に拡大します。これを行うには、特定の境界線に対してすべてのポイントをチェックし、それをどれだけ拡張できるかを決定します.
ソリッド (つまり、交差しない) オブジェクトをモデル化するには、物理エンジンを使用できます。たまたま、先日、完全な初心者向けの Farseer チュートリアルを読みました。これには、要件をほぼ正確に説明するビデオが含まれています。Farseerは、聞いたことがあるかもしれない box2d の .NET バージョンです。