From 41f9143641f8b63ca2a57a47d1f421f59cffc033 Mon Sep 17 00:00:00 2001 From: NathanSmela Date: Sat, 3 Jan 2026 07:05:48 -0800 Subject: [PATCH 1/2] added Volume and Area to MeshMeasurements for simple requests --- CHANGES.md | 5 +++- mesh/MeshMeasurements.cs | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) 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..d77211a2 100644 --- a/mesh/MeshMeasurements.cs +++ b/mesh/MeshMeasurements.cs @@ -183,6 +183,67 @@ public static Vector2d VolumeArea( DMesh3 mesh, IEnumerable triangles, + /// + /// 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()) + { + Index3i tri = mesh.GetTriangle(tid); + // Get vertices of triangle i. + Vector3d v0 = mesh.GetVertex(tri.a); + Vector3d v1 = mesh.GetVertex(tri.b); + Vector3d v2 = mesh.GetVertex(tri.c); + + // Get cross product of edges and (un-normalized) normal vector. + Vector3d V1mV0 = v1 - v0; + Vector3d V2mV0 = v2 - v0; + Vector3d N = V1mV0.Cross(V2mV0); + + double tmp0 = v0.x + v1.x; + double f1x = tmp0 + v2.x; + mass_integral += N.x * f1x; + } + + 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 Vector2d Area(DMesh3 mesh) + { + double area_sum = 0; + foreach (int tid in mesh.TriangleIndices()) + { + Index3i tri = mesh.GetTriangle(tid); + // Get vertices of triangle i. + Vector3d v0 = getVertexF(tri.a); + Vector3d v1 = getVertexF(tri.b); + Vector3d v2 = getVertexF(tri.c); + + // Get cross product of edges and (un-normalized) normal vector. + Vector3d V1mV0 = v1 - v0; + Vector3d V2mV0 = v2 - v0; + Vector3d N = V1mV0.Cross(V2mV0); + + 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 From a427045389d2a93e1e205e4bf83163069e623e80 Mon Sep 17 00:00:00 2001 From: NathanSmela Date: Sat, 3 Jan 2026 15:45:00 -0800 Subject: [PATCH 2/2] utilizing DMesh3.GetTriVertices(int tId, out Triangle3d tri) --- mesh/MeshMeasurements.cs | 55 +++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/mesh/MeshMeasurements.cs b/mesh/MeshMeasurements.cs index d77211a2..5f84551f 100644 --- a/mesh/MeshMeasurements.cs +++ b/mesh/MeshMeasurements.cs @@ -183,6 +183,29 @@ 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 @@ -194,20 +217,9 @@ public static double Volume(DMesh3 mesh) foreach (int tid in mesh.TriangleIndices()) { - Index3i tri = mesh.GetTriangle(tid); - // Get vertices of triangle i. - Vector3d v0 = mesh.GetVertex(tri.a); - Vector3d v1 = mesh.GetVertex(tri.b); - Vector3d v2 = mesh.GetVertex(tri.c); - - // Get cross product of edges and (un-normalized) normal vector. - Vector3d V1mV0 = v1 - v0; - Vector3d V2mV0 = v2 - v0; - Vector3d N = V1mV0.Cross(V2mV0); - - double tmp0 = v0.x + v1.x; - double f1x = tmp0 + v2.x; - mass_integral += N.x * f1x; + 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); @@ -220,22 +232,13 @@ public static double Volume(DMesh3 mesh) /// Return value is area /// Note that if triangles don't define closed region, volume is probably nonsense... /// - public static Vector2d Area(DMesh3 mesh) + public static double Area(DMesh3 mesh) { double area_sum = 0; foreach (int tid in mesh.TriangleIndices()) { - Index3i tri = mesh.GetTriangle(tid); - // Get vertices of triangle i. - Vector3d v0 = getVertexF(tri.a); - Vector3d v1 = getVertexF(tri.b); - Vector3d v2 = getVertexF(tri.c); - - // Get cross product of edges and (un-normalized) normal vector. - Vector3d V1mV0 = v1 - v0; - Vector3d V2mV0 = v2 - v0; - Vector3d N = V1mV0.Cross(V2mV0); - + mesh.GetTriVertices(tid, out Triangle3d tri); + Vector3d N = (tri.V1 - tri.V0).Cross(tri.V2 - tri.V0); area_sum += 0.5 * N.Length; }