発散定理を使えば爆速!3Dモデルの体積計算を驚くほど効率化するテクニック
Hilariously fast volume computation with the divergence theorem (2018)
Hilariously fast volume computation with the divergence theorem (2018)
この記事では、発散定理(Divergence Theorem)を応用して、3D形状の体積を驚くほど高速に計算する手法について解説しています。複雑な形状の体積を求める際、単純な手法では計算コストが膨大になりますが、この数学的なアプローチを使えば劇的なパフォーマンス向上が期待できます。幾何学的な計算を扱うエンジニアにとって、実装のヒントになる非常に面白いトピックです。
こういう記事大好き。シンプルで高速、AI不使用で、何か新しい学びがある。
メッシュから三角形を全部取り出して、その三角形と特定の平面への投影との間にできるプリズム状のポリトープの体積を計算して、投影の向きに合わせてプラスマイナスの符号をつける、っていうのと結局同じことじゃない?この手の公式は基本的な幾何学に基づいているし。
直感的には、ナイーブな公式っていうのは三角形のピラミッド体積の合計を符号付きで原点に対して計算してるってことだよね。彼らが導出したのもまさにそれっぽそう。これはGISデータの地図ポリゴン面積を計算するときに数学キャンプで教わった、各エッジの三角形面積を足し合わせていく2Dポリゴン面積計算の一般化だね。AI以前は数学の知識を得るのが大変だった記憶があるけど、ここまで難しかったっけ?それにしても著者が言っている「メッシュをレンダリングしてサンプリングするのと同等」という箇所はよく分からない。
これにベクトル解析はいらないよ。幾何学的な直感で十分。要はX軸に平行な三角柱の符号付き体積を合計しているだけだから。可視化: https://jsfiddle.net/L7r1hwca/ 。レンダリングとサンプリングを使ったナイーブなアルゴリズムが何を指しているのか全然わからないんだけど(???)。
これは背景知識によって「へえ、すごい!」となるか「え、このテクニックって有名じゃないの?」となる分かれ道だね ;) 1980年に書かれたFortranの似たような実装があって、重心とかの他のプロパティも計算できるよ: https://calgo.acm.org/550.zip アルゴリズム550: Solid Polyhedron Measures。でもMessnerが最初に発表したのは1970年の学会論文が先だと思う。
一方で、格子点上に頂点があるポリゴンの「面積」を計算したいなら、内部の点の数Iと境界上の点の数Bを数えれば面積Aは A = I + B/2 - 1 になるよ。これがピックの定理 (https://en.wikipedia.org/wiki/Pick's_theorem) で、個人的に一番気に入っている結果の一つ。残念ながら高次元にはうまく一般化できないんだけど。もしポストみたいに多面体の体積が欲しいなら、靴紐の公式の3次元版(本質的に同じ)が使えるよ。三角形の頂点を Va, Vb, Vc とすると、体積Vはすべての三角形の符号付き体積 V_∆ = 1/6 Va ^ Vb ^ Vc の合計になる。これぞ符号付き面積と体積、行列式、外積代数の美しさだね。なぜそうなるのか理解するにはこの短い動画がすごくいい: https://youtu.be/Sv7VseMsOQc
ここではメッシュが単純で閉じていることが重要だね。出力を信頼する前に、これらの前提条件を必ず検証しておかないと。
メッシュのミスにも強いよ。例えば三角形が完全につながっていなくても、それなりの答えを出してくれる。 https://mathstodon.xyz/@keenancrane/109388206643166726
これ、体積計算のための有名な別のプロセスの焼き直しみたいだね。各面と原点(あるいは任意の固定点でも同じだけど)で形成される四面体の符号付き体積を合計するっていう手法。でも導出としてはすごくクール!
最初は「これって四面体計算のトリックを少し言い換えただけじゃない?」って思ったし、ある意味その通りなんだけど、YとZ座標でうまく打ち消し合う部分があるから、実用上は計算量が減るんだよね。