diff --git a/source/model/modelutils.js b/source/model/modelutils.js index de3b5af..9d63b84 100644 --- a/source/model/modelutils.js +++ b/source/model/modelutils.js @@ -259,12 +259,35 @@ OV.GetModelTopology = function (model) OV.IsModelSolid = function (model) { + function GetEdgeOrientationInTriangle (topology, triangleIndex, edgeIndex) + { + const triangle = topology.triangles[triangleIndex]; + const triEdge1 = topology.triangleEdges[triangle.triEdge1]; + const triEdge2 = topology.triangleEdges[triangle.triEdge2]; + const triEdge3 = topology.triangleEdges[triangle.triEdge3]; + if (triEdge1.edge === edgeIndex) { + return triEdge1.reversed; + } + if (triEdge2.edge === edgeIndex) { + return triEdge2.reversed; + } + if (triEdge3.edge === edgeIndex) { + return triEdge3.reversed; + } + return null; + } + const topology = OV.GetModelTopology (model); - for (let i = 0; i < topology.edges.length; i++) { - const edge = topology.edges[i]; + for (let edgeIndex = 0; edgeIndex < topology.edges.length; edgeIndex++) { + const edge = topology.edges[edgeIndex]; if (edge.triangles.length !== 2) { return false; } + const edgeOrientation1 = GetEdgeOrientationInTriangle (topology, edge.triangles[0], edgeIndex); + const edgeOrientation2 = GetEdgeOrientationInTriangle (topology, edge.triangles[1], edgeIndex); + if (edgeOrientation1 === edgeOrientation2) { + return false; + } } return true; }; diff --git a/test/tests/quantities_test.js b/test/tests/quantities_test.js index 537bf81..bfb976b 100644 --- a/test/tests/quantities_test.js +++ b/test/tests/quantities_test.js @@ -14,6 +14,33 @@ describe ('Quantities', function () { assert.strictEqual (volume, null); }); + it ('Cube with Wrongly Oriented Triangle Volume Calculation', function () { + var cube = new OV.Mesh (); + cube.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0)); + cube.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0)); + cube.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0)); + cube.AddVertex (new OV.Coord3D (0.0, 1.0, 0.0)); + cube.AddVertex (new OV.Coord3D (0.0, 0.0, 1.0)); + cube.AddVertex (new OV.Coord3D (1.0, 0.0, 1.0)); + cube.AddVertex (new OV.Coord3D (1.0, 1.0, 1.0)); + cube.AddVertex (new OV.Coord3D (0.0, 1.0, 1.0)); + cube.AddTriangle (new OV.Triangle (0, 1, 5)); + cube.AddTriangle (new OV.Triangle (0, 5, 4)); + cube.AddTriangle (new OV.Triangle (1, 2, 6)); + cube.AddTriangle (new OV.Triangle (1, 6, 5)); + cube.AddTriangle (new OV.Triangle (2, 3, 7)); + cube.AddTriangle (new OV.Triangle (2, 7, 6)); + cube.AddTriangle (new OV.Triangle (3, 0, 4)); + cube.AddTriangle (new OV.Triangle (3, 4, 7)); + cube.AddTriangle (new OV.Triangle (0, 3, 2)); + cube.AddTriangle (new OV.Triangle (0, 2, 1)); + cube.AddTriangle (new OV.Triangle (4, 5, 6)); + cube.AddTriangle (new OV.Triangle (4, 7, 6)); + const model = testUtils.GetModelWithOneMesh (cube); + const volume = OV.CalculateModelVolume (model); + assert.strictEqual (volume, null); + }); + it ('Cube Surface Area Calculation', function () { const model = testUtils.GetModelWithOneMesh (testUtils.GetCubeMesh ()); const surface = OV.CalculateModelSurfaceArea (model);