diff --git a/CHANGES.md b/CHANGES.md index 46a7bd53..c631688d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -33,4 +33,7 @@ MeshEditor changes/improvements DMesh3 changes - - invalid/degenerate tris no longer assert in InsertTriangle/AppendTriangle \ No newline at end of file + - invalid/degenerate tris no longer assert in InsertTriangle/AppendTriangle + +MeshMeasurements changes + - added Volume and Area for simple requests \ No newline at end of file diff --git a/mesh/MeshMeasurements.cs b/mesh/MeshMeasurements.cs index 1291f488..5f84551f 100644 --- a/mesh/MeshMeasurements.cs +++ b/mesh/MeshMeasurements.cs @@ -183,6 +183,70 @@ public static Vector2d VolumeArea( DMesh3 mesh, IEnumerable triangles, + /// + /// Compute volume and surface area of triangles of mesh. + /// Return value is (volume,area) + /// Note that if triangles don't define closed region, volume is probably nonsense... + /// + public static Vector2d VolumeArea(DMesh3 mesh) + { + double mass_integral = 0.0; + double area_sum = 0; + foreach (int tid in mesh.TriangleIndices()) + { + mesh.GetTriVertices(tid, out Triangle3d tri); + Vector3d N = (tri.V1 - tri.V0).Cross(tri.V2 - tri.V0); + + area_sum += 0.5 * N.Length; + mass_integral += N.x * (tri.V0.x + tri.V1.x + tri.V2.x); + } + + return new Vector2d(mass_integral * (1.0 / 6.0), area_sum); + } + + + + /// + /// Compute entire volume of mesh. + /// Return value is volume + /// Note that if triangles don't define closed region, volume is probably nonsense... + /// + public static double Volume(DMesh3 mesh) + { + double mass_integral = 0.0; + + foreach (int tid in mesh.TriangleIndices()) + { + mesh.GetTriVertices(tid, out Triangle3d tri); + Vector3d N = (tri.V1 - tri.V0).Cross(tri.V2 - tri.V0); + mass_integral += N.x * (tri.V0.x + tri.V1.x + tri.V2.x); + } + + return mass_integral * (1.0 / 6.0); + } + + + + /// + /// Compute surface area of triangles of mesh. + /// Return value is area + /// Note that if triangles don't define closed region, volume is probably nonsense... + /// + public static double Area(DMesh3 mesh) + { + double area_sum = 0; + foreach (int tid in mesh.TriangleIndices()) + { + mesh.GetTriVertices(tid, out Triangle3d tri); + Vector3d N = (tri.V1 - tri.V0).Cross(tri.V2 - tri.V0); + area_sum += 0.5 * N.Length; + } + + return area_sum; + } + + + /// /// Compute area of one-ring of mesh vertex by summing triangle areas. /// If bDisjoint = true, we multiple each triangle area by 1/3