Wie berechne ich das Volumen eines gespeicherten Objekte in STL-Dateien?
Habe ich .stl (STL ist ein Dateiformat, native zu den Stereolithographie-CAD-software von 3D Systems) Dateien, von denen muss ich berechnen Sie das Volumen. Wie mache ich das? Ich bin mit der Berechnung unter, aber die Lautstärke ist nicht gleich berechnet, die von anderen software -
float x1,y1,z1;
float x2,y2,z2;
float x3,y3,z3;
Die oben genannten sind die Eckpunkte. triangles
ist einfach eine Datenstruktur, die halten ein Objekt mit den Eckpunkten jedes Dreiecks.
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;
Haben Sie auch die Berechnung mit dem normalen-Vektor?
- Was sind
.stl
-Dateien. Was ist mit der anderen software? Und was zur Hölle ist plizz?! - en.wikipedia.org/wiki/STL_%28file_format%29 Plizz=Bitte. Können Sie mir helfen?
- Bitte erläutern Sie, was
.stl
- Dateien sind, und uns sagen, welche software Sie verwenden. - STL ist ein Dateiformat, native zu den Stereolithographie-CAD-software von 3D Systems.
- en.wikipedia.org/wiki/STL_%28file_format%29 Diese Seite gibt eine kurze Erklärung, was STL-Dateien.
- Danke, es klingt sehr spezialisiert.
- Was meinst du speziell?
- Ich meine, es ist unwahrscheinlich, dass jemand hier kennt es. Können Sie wirklich mit der syntax
totalVolume += currentVolume = ...
sieht es aus wie Es würde zu einem Syntaxfehler in einer traditionellen Programmiersprache. - Ja, Sie können es verwenden,.
- Diese wird gekennzeichnet als CAD-Frage. Menschen vertraut mit CAD vertraut sein sollte .stl-Dateien.
- Dieser kann eine Hilfe sein. Ich verwendet bison zu erstellen, die einen schnellen parser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Volumen der Polyeder beschrieben wird, in Polyeder Artikel in der Wikipedia. Jede gültige STL Tesselation muss genau ein Polyeder, wo jede Facette ist eine Seite, so ist die Formel diskutiert es hält.
Vorausgesetzt, die Eckpunkte orientieren sich entgegen dem Uhrzeigersinn (Blick hinunter auf die normals nach außen) folgende Erweiterung gilt:
Gleichung 1 ist gerade die Divergenz-Formel für Polyeder. Der p[i,j] sind die jth vertex (als Vektor vom Ursprung) des I-TEN Dreiecks.
Gleichung 2 erweitert dies durch die Tatsache, dass das Kreuzprodukt der beiden dreiecksseiten (ein Parallelogramm) ist ein Normalenvektor des Dreiecks mit Umfang zweimal die Fläche des Dreiecks.
Durch die Art und Weise, das ist, warum das Dreieck normal nicht zeigen, bis in Ihrem Ausdruck, auch wenn Ihre intuition sagt, es sollte da sein, irgendwie. Es ist bereits in der Suppe!
Gleichung 3 nur erweitert sich Gleichung 2 mit der distributiven Eigenschaften der Kreuz-Produkt, und die Tatsache, dass ein vector cross selbst ist der null-Vektor.
Den Datenträger, den Sie erhalten aus Gleichung 3 unterzeichnet ist, entsprechend der Orientierung der Dreiecke. Ich habe ausgerichtet, meine Formulierung zu vereinbaren, mit dem code, aber Sie müssen möglicherweise ein negatives Ergebnis. Wenn dem so ist, nehmen Sie den absoluten Wert.
Nun schreiben die Summanden in Ihrer notation (außer, dass ich nicht die Mühe putting in der wiederholten Dreieck[i]) bekomme ich:
Genau dem entspricht, was du geschrieben hast (außer Bestellung)!
Also es gibt ein paar Möglichkeiten:
(1) Vielleicht ist Ihre STL-Datei ist fehlerhaft, und die Dreiecke sind nicht alle orientiert sich konsequent. Sie können dies überprüfen, indem Sie sicherstellen, dass jede Kante von einem Dreieck einmal in Vorwärtsrichtung und einmal in die entgegengesetzte Richtung. Durch und "Kante" meine ich ein paar Eckpunkte (p[r], p[s]), die Teil des gleichen Dreiecks. Ich bin ändern notation und mit Hilfe der Tiefstellung, um anzuzeigen, der eindeutig indizierten vertex in der Datei, nicht der index des vertex relativ zu dem Gesicht, als ich mit den beiden-index-notation oben).
Wenn ein Dreieck Kante (p[r], p[s]) in seiner Liste der orientierte Kanten, dann einige andere Dreieck haben muss, (p[s], p[r]) (gleiche Eckpunkte, umgekehrte Reihenfolge) in die Liste der orientierten Kanten.
(2) Die tessellation ist nicht geschlossen. Dies ist die gleiche Prüfung wie 1, außer, dass Sie offen ist, wenn nur ein Dreieck verwendet die edge-unabhängig von der Ausrichtung.
(3) ich Wage es zu erwähnen? Sind Sie sicher, dass Sie initialisiert currentVolume?
(4) Sie bekommen die richtige Antwort, aber die Lautstärke ist negativ, und Sie täuschen zu denken, die Methode ist falsch. Siehe meine Kommentare oben.
int versus doppelte problem?
/6; vielleicht sollte /6.0;