点の分布・サンプリング

円盤一様サンプリング

Uniform Disk / Concentric Mapping

円の面積に対して均等な点を選ぶ。

6 / 10

インタラクティブデモ

デモを準備しています…

円盤一様サンプリング

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

円(円盤)の中に、面積に対して均等に点を選ぶ方法です。「半径と角度をそれぞれ乱数で選ぶ」と、中心に点が集まってしまいます。半径 rr の内側の面積は r2r^2 に比例するので、半径には乱数の平方根を使うのが正解です。さらに、正方形の上で層化した点を、区画の形をなるべく崩さずに円盤へ写す「同心写像」(シャーリーとチウの方法)もよく使われます。

ゲームでの使いどころ

  • 円形の範囲への配置:プレイヤーの周り半径 10 m のどこかに敵を出す、爆発の範囲に破片を散らす、円形の池の周りに石を置く。
  • 弾のばらつき:散弾の広がりを円の中で均等にする(中心に集めたいなら正規分布)。
  • 被写界深度とソフトシャドウ:被写界深度のレンズの口径や、光源の円盤の上に標本を置く。層化した点を同心写像で写すと、少ない標本でもむらが少ない。
  • 余弦重みの方向:円盤の点を真上へ持ち上げると、余弦重みの半球の方向になる(マリーの方法)。

しくみ

平方根を使う理由:半径 rr(0〜1)より内側に入る確率は、面積の比 r2r^2 でなければなりません。一様乱数 uu に対して r2=ur^2 = u、つまり r=ur = \sqrt{u} とすれば、この条件を満たします(逆 CDF 法の例)。角度は θ=2πv\theta = 2\pi v で一様です。

同心写像:正方形 [−1,1]2[-1, 1]^2 の点 (a,b)(a, b) を、正方形の同心の枠が円盤の同心の輪へ移るように写します。

∣a∣>∣b∣ のとき r=a, φ=π4ba;それ以外は r=b, φ=π2−π4ab|a| > |b| \text{ のとき } r = a,\ \varphi = \frac{\pi}{4}\frac{b}{a}; \qquad \text{それ以外は } r = b,\ \varphi = \frac{\pi}{2} - \frac{\pi}{4}\frac{a}{b}

点は (rcos⁡φ, rsin⁡φ)(r\cos\varphi,\ r\sin\varphi) です。面積は保たれ(一様のまま)、区画の縦横比のゆがみも小さいので、層化や低食い違い列の均等さがそのまま残ります。平方根の方法では、中心の区画が細い扇形に、外側の区画が平たい帯になり、隣り合う点どうしの距離が崩れます。

棄却法:円を囲む正方形に点を打ち、外に出たものを捨てます。簡単で正しいのですが、1−π/4≈21.5%1 - \pi/4 \approx 21.5\% が無駄になり、必要な乱数の数も一定になりません。

実装のポイント

  • ドーナツ形(輪):内側の半径 r0r_0 と外側 r1r_1 の間なら、r=r02+u (r12−r02)r = \sqrt{r_0^2 + u\,(r_1^2 - r_0^2)} とします。
  • だ円:円盤の点を軸ごとに拡大すれば、だ円の中でも一様のままです(面積の比が保たれるため)。
  • シェーダーでは:同心写像の分岐は、GPU でも問題になるほどの負荷ではありません。固定の標本配置なら、あらかじめ計算して定数の配列にします。

つまずきやすい点

  • 半径をそのまま一様に:もっともよくある誤りです。中心の小さな円に、面積の割に多くの点が入ります。
  • 原点での割り算:同心写像は a=b=0a = b = 0 で 0 で割ることになるので、先に場合分けします。
  • 層化の効果が消える:せっかく層化した点も、ゆがみの大きい写像で写すと、点の間隔が不ぞろいになります。

デモで試すこと

  1. 左の正方形には、区画ごとに 1 つずつ層化した点が並んでいます。右がそれを円盤へ写した結果で、区画の模様も一緒に写しています。
  2. 「半径をそのまま一様に」では、中心の区画が小さくつぶれ、点が中心に集まります。右下のグラフ(面積の等しい輪ごとの点の数)の左端が高くなります。
  3. 「半径を平方根に」ではグラフが平らになりますが、区画の形が中心で細い扇形にゆがみます。「同心写像」では、面積も区画の形もほぼ保たれます。
  4. 「棄却法」では、赤い点(捨てた点)の割合を確かめてください。「正方形から円盤への変形を動かす」で、写像の様子を連続的に見られます。

参考資料

Fast Poisson Disk Sampling in Arbitrary Dimensions ↗

分野全体の資料で、この項目を直接扱っているとは限りません。