「符号付き距離関数」の版間の差分
編集の要約なし |
編集の要約なし |
||
(同じ利用者による、間の2版が非表示) | |||
14行目: | 14行目: | ||
d = ||\boldsymbol{x} - \boldsymbol{c}|| - r | d = ||\boldsymbol{x} - \boldsymbol{c}|| - r | ||
</math> | </math> | ||
=== 正n角形 === | |||
0番目の頂点がx軸に乗っている場合で考える。 | |||
外側でSDFは次の手順で得られる。(より厳密には図形の外側の場合をさらに細かく考える必要があるが、図形の内側や辺の近くではこれで問題ないと思う) | |||
* 何番目の辺が最も近いか考える(角度でわかる) | |||
* その辺の法線ベクトルとの内積を用いて距離を計算する | |||
まず、原点から点 <math>(x,y)</math> に伸ばした半直線が<math>x</math>軸となす角は | |||
<math>\theta = \mathrm{Atan2}(y,x)</math> | |||
これに一番近い辺は | |||
<math>k = \lfloor \theta / (2\pi / n) \rfloor</math> | |||
番目である。 | |||
その辺の法線ベクトルは | |||
<math> | |||
v = \left( \cos\frac{2\pi(0.5+k)}{n},~ \sin\frac{2\pi(0.5+k)}{n} \right) | |||
</math> | |||
<math> | |||
d = (x - tv) \cdot v | |||
</math> | |||
ここで <math>t</math> は辺の中心と原点の距離である | |||
==3Dの例== | ==3Dの例== | ||
=== 球 === | |||
円と同様。 | |||
<math> | |||
d = ||\boldsymbol{x} - \boldsymbol{c}|| - r | |||
</math> | |||
==テクニック== | ==テクニック== | ||
計算上のテクニックを書き残していきたい | 計算上のテクニックを書き残していきたい |
2024年7月30日 (火) 21:23時点における最新版
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]
テクニック
計算上のテクニックを書き残していきたい