Fix solid body detection: an edge should appear with different directions in the neighbour triangles.

This commit is contained in:
Viktor Kovacs 2021-05-18 17:21:37 +02:00
parent e873f9cd4e
commit 4bceb5b2b2
2 changed files with 52 additions and 2 deletions

View File

@ -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;
};

View File

@ -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);