レベルサーフェスの視覚化
-
10-10-2019 - |
質問
この方法を使用して水平面ビジュアライザを開発しようとしています(これが標準的な方法なのか、それともより良い方法があるのかはわかりません)。
- 1.任意の関数を取得
f(x,y,z)=k
(k は定数)、x、y、z の境界。また、2 つのグリッド パラメーター stepX と stepZ も取り込みます。- 2.レベル曲線の問題に還元するには、zMin から zMax まで stepZ 間隔で繰り返します。それで
f(x,y,z)=k => f(x,y,fixedZ)=k
- 3.stepX で同じ手順を実行し、問題を次のように縮小します。
f(fixedX, y, fixedZ)=k
- 4.解決する
f(fixedX, y, fixedZ) - k = 0
その方程式を満たす y のすべての値について (ある種の根探索アルゴリズムを使用して)- 5.生成されたすべての点について、それらをレベル カーブとしてプロットします (内側のループは指定された Z でレベル カーブを生成し、その後、異なる Z 値についてはレベル カーブのスタックが存在します)。
- 6 (オプション)。レベル セットに属するこれらのレベル カーブ/ポイントからメッシュを生成します。
私が直面している問題はステップ 4 です。その方程式を満たす y の値がいくつあるか (より具体的には、y の一意の実際の値がいくつあるか) を事前に知る方法はありません。
また、プログラムをできるだけ一般的なものにしようとしているため、元の機能を制限しないようにしています f(x,y,z)=k
平滑性や k 以外の多項式などの制約は、水平面の要求に応じて一定でなければなりません。
関数に複数のルートがある場合でも、関数のルートを識別できる (CAS/シンボリック解決を使用しない) アルゴリズムはありますか?領域全体で符号が変化しない可能性があるため、二分法ではこれに苦労することはわかっていますが、セカント/ニュートン法はどうなのでしょうか?セカント/ニュートン法はどの関数セットに使用できますか?また、指定された 2 つの範囲内ですべての一意の実根を検出して見つけることができますか?それとも、水平面を生成/視覚化するためのより良い方法はありますか?
解決
私の問題の解決策が見つかったと思います。もう少し調べてみたところ、水平面は等値面と同義であることがわかりました。したがって、理論的には、マーチングキューブ手法のようなものが機能するはずです。
他のヒント
マーチング キューブ アルゴリズムの例が必要な場合は、こちらをご覧ください。
http://stemkoski.github.com/Three.js/Marching-Cubes.html
(グラフィックスには JavaScript/Three.js を使用します)。
理論の詳細については、次の記事を参照してください。
簡単な方法ですが、
2D:color = Floor(q*f(x,y)) をグレースケールでプロット (x,y) します。ここで、q は任意の係数です。3D:プロット (x,y, フロア(q*f(x,y))
事実上、同等の高さの関数は同じ水平面上に表現されます。
レベル曲線を取得する場合は、2D メソッドとエッジ検出/領域分類を使用して、同じレベル上の点 (x,y) を取得できます。