4

私は .stl ( STL は 3D Systems によって作成された立体造形 CAD ソフトウェアにネイティブなファイル形式です) ファイルを持っており、そこから体積を計算する必要があります。どうすればいいですか?以下の計算を使用していますが、音量は他のソフトウェアで計算されたものと等しくありません

float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;

上記が頂点です。triangles各三角形の頂点を持つオブジェクトを保持する単なるデータ構造です。

totalVolume += currentVolume = 
(triangles[i].x1*triangles[i].y2*triangles[i].z3 - 
triangles[i].x1*triangles[i].y3*triangles[i].z2 -

triangles[i].x2*triangles[i].y1*triangles[i].z3 + 
triangles[i].x2*triangles[i].y3*triangles[i].z1 + 
triangles[i].x3*triangles[i].y1*triangles[i].z2 - 
triangles[i].x3*triangles[i].y2*triangles[i].z1) / 6;

法線ベクトルの計算も含まれますか?

4

2 に答える 2

6

多面体の体積については、ウィキペディアの多面体の記事で説明されています。有効な STL テッセレーションは、正確に各ファセットが側面である多面体でなければならないため、ここで説明した式が成り立ちます。

頂点が反時計回り (外側の法線を見下ろす) に向いていると仮定すると、次の展開が成り立ちます。 三角形の頂点に関する拡張

式 1 は、多面体の発散式です。p[i,j] は、i 番目の三角形の j 番目の頂点 (原点からのベクトル) です。

式 2 は、2 つの三角形の辺 (平行四辺形) の外積が、三角形の面積の 2 倍の大きさを持つ三角形の法線ベクトルであるという事実を使用して、これを拡張します。

ところで、三角形の法線が表現に表示されないのはこのためです。すでにスープに入っています!

式 3 は、外積の分配特性を使用して式 2 を拡張したものであり、ベクトル クロス自体がゼロ ベクトルであるという事実です。

方程式 3 から得られるボリュームは、三角形の方向に従って署名されます。あなたのコードと一致するように定式化を調整しましたが、否定的な結果が得られる可能性があります。その場合は、絶対値を取ってください。

今、あなたの記法で被加数を書いています(私は繰り返された三角形[i]をわざわざ入れないことを除いて)、私は得ます:

(-x3 y2 z1 + x2 y3 z1 + x3 y1 z2 - x1 y3 z2 - x2 y1 z3 + x1 y2 z3)/6.;

これはあなたが書いたものと完全に一致します (順序を除く)!

したがって、いくつかの可能性があります。

(1) STL ファイルに欠陥があり、三角形の向きがすべて一貫していない可能性があります。これは、各エッジが三角形によって前方方向に 1 回、反対方向に 1 回使用されていることを確認することで確認できます。「エッジ」とは、同じ三角形の一部である頂点のペア (p[r]、p[s]) を意味します。表記を変更し、下付き文字を使用して、ファイル内の一意にインデックス付けされた頂点を示します。上記の 2 つのインデックス表記で行ったように、面に対する頂点のインデックスではありません)。

三角形の方向付けられたエッジのリストにエッジ (p[r], p[s]) がある場合、他の三角形のリストには (p[s], p[r]) (同じ頂点、逆順) が含まれている必要があります。方向付けられたエッジの。

(2) テッセレーションが閉じていません。これは 1 と同じテストですが、方向に関係なく、エッジを使用する三角形が 1 つだけの場合は開いています。

(3) あえて言いますか。currentVolumeを初期化しましたか?

(4) 正しい答えが得られますが、ボリュームが負であり、方法が間違っていると思い込んでいます。上記の私のコメントを参照してください。

于 2011-07-01T22:20:51.357 に答える
1

int 対 double の問題?

/ 6; 多分 / 6.0 であるべきです。

于 2011-09-29T18:36:26.500 に答える