2016-07-19 7 views
1

許容できるものを発明できない。 私の最初の(そして唯一の)アプローチはかなり厄介です:丸い矩形内に一様分布のランダムな位置を生成する

  1. 計算面積= non_rounded_area + area_of_roundedコーナー* 4.のは、矩形の画素数としてこの領域を考えてみましょう。
  2. 範囲[0..area]から乱数を取得すると、ピクセルインデックスとなります。
  3. 何とかそのインデックスからx座標とy座標を取得します。

ステップ3はどのように実行するのですか?
私は四角形(と一つのコーナー)の1/4の部分を考慮し、他の四半期の結果を回転させるだけでも十分だと思います。
[OK]を、私は与えられたコーナーに属するピクセルの数を知っていると仮定します。 そして、丸められていない領域に属するインデックスからx座標とy座標を簡単に取得できます。

ただし、コーナーに属するピクセルの場合はどうすればよいですか? 私の考えは、「ピクセルが円に属するかどうかを判断する」ことについて飛行していますが、それらを明白に表現することはできません。

+1

関連する寸法を定量化できますか?どのくらいの長方形ですか?分析的に表現することができる四半期の円か何かの形で四捨五入されていますか?いくつかの実際のパラメータ値を与えることができますか? – pjs

+2

[拒否サンプリング](https://en.wikipedia.org/wiki/Rejection_sampling)を使用する簡単でわかりやすい方法にこだわってみませんか?あなたの丸い矩形の凸包のためのちょうどxとyをサンプリングします(=丸められていないrect)。サンプリングされた点がrect内にあれば受け入れます。 (あなたの不合格領域は全領域に比べて小さくすべきです) – sascha

+0

rectはスクリーンのサイズに見合っています。コーナー半径は5〜175ピクセルです。拒否サンプリングの方法は、そのパフォーマンスの欠点のために受け入れられません。私の場合は重要です(モバイルゲームではパーティクルシステムのエミッター) – Papirosnik

答えて

2

ここでは、完全な矩形に一般化することができます1つの象限のためにそれを行う方法です:

第一象限(赤+オレンジ+グリーン)での総画素数を計算する:

int totalPixels = w * h; 

int invalidCornerPixels = (int)((float)(r * r) * ((4.0f - PI)/4.0f)); 

オレンジエリア:

そして赤色領域(丸みを帯びた四角形の外側にある隅のピクセル)を計算します赤い領域に等しい。赤+緑領域のピクセルをサンプリングし、赤領域にある場合は、代わりにオレンジ領域のランダムピクセルをサンプリングします。

int pixelIndex = randomValue(redGreenArea); 
int pixelX = pixelIndex % w; 
int pixelY = pixelIndex/w; 

テストサンプリング画素は赤色領域であり、必要に応じてリサンプリングする場合:

if((pixelX < r) && (pixelY < r)) 
{ 
    int circleX = r - pixelX; 
    int circleY = r - pixelY; 
    if(((circleX * circleX) + (circleY * circleY)) > (r * r)) 
    { 
     pixelIndex = randomValue(invalidCornerPixels) + redGreenArea; 
     pixelX = pixelIndex % w; 
     pixelY = pixelIndex/w; 
    } 
} 

この1 -

int redGreenArea = totalPixels - invalidCornerPixels; 

randomValue(n)が0からnまでのランダムな整数を返すと仮定する最大2つの乱数生成(通常は1つだけ)が必要で、拒否サンプリングよりも複雑ではありません。同じテストを実装する必要があるためです。 totalPixels,invalidCornerPixelsおよびredGreenAreaの計算は、1回行うことができ、所定の矩形に対して保存することができます。

弱点は、丸め誤差のため、実際にテストに失敗するピクセル数が正確にはinvalidCornerPixelsに等しくないことがあり、非常にわずかに不均一な分布になることです。あなたは、ブルートフォースオフライン(r x rの正方形でテストに失敗したピクセルを数える)とrの各値のルックアップテーブルを作成してinvalidCornerPixelsを計算することで対処することができます。しかし、パーティクルジェネレータに使用すると目立つことはないだろう。別の弱点は、赤い領域がオレンジ色の領域に重なっていると失敗することです。

+0

'r

+0

@マークランソム、それは合理的な解決策のように見えます。今すぐ試してみましょう。ありがとうございました。 – Papirosnik

+1

うん!それは魅力のように機能します!均一性の偏差(存在する場合)はそれほどわかりにくいため)))多くのありがとう。 – Papirosnik

関連する問題