符号付き距離関数

提供:ペチラボ書庫
ナビゲーションに移動 検索に移動

Signed Distance Function の頭文字を取って SDF ともよく呼ばれる

定義

距離空間において、集合の境界のうち最も近い点との距離。符号は境界の内側か外側かで変わる。

符号の決め方はどちらでもよいが、このページでは普通の感覚に合わせて外側を正としておく

2Dの例

半径 [math]\displaystyle{ r }[/math] の円とは中心 [math]\displaystyle{ \boldsymbol{c} }[/math] からの距離が [math]\displaystyle{ r }[/math] の点の集合であることから、

[math]\displaystyle{ d = ||\boldsymbol{x} - \boldsymbol{c}|| - r }[/math]

正n角形

0番目の頂点がx軸に乗っている場合で考える。

外側でSDFは次の手順で得られる。(より厳密には図形の外側の場合をさらに細かく考える必要があるが、図形の内側や辺の近くではこれで問題ないと思う)

  • 何番目の辺が最も近いか考える(角度でわかる)
  • その辺の法線ベクトルとの内積を用いて距離を計算する

まず、原点から点 [math]\displaystyle{ (x,y) }[/math] に伸ばした半直線が[math]\displaystyle{ x }[/math]軸となす角は [math]\displaystyle{ \theta = \mathrm{Atan2}(y,x) }[/math]

これに一番近い辺は [math]\displaystyle{ k = \lfloor \theta / (2\pi / n) \rfloor }[/math] 番目である。

その辺の法線ベクトルは [math]\displaystyle{ v = \left( \cos\frac{2\pi(0.5+k)}{n},~ \sin\frac{2\pi(0.5+k)}{n} \right) }[/math]

[math]\displaystyle{ d = (x - tv) \cdot v }[/math]

ここで [math]\displaystyle{ t }[/math] は辺の中心と原点の距離である

3Dの例

円と同様。

[math]\displaystyle{ d = ||\boldsymbol{x} - \boldsymbol{c}|| - r }[/math]

テクニック

計算上のテクニックを書き残していきたい