Fix solid body detection: an edge should appear with different directions in the neighbour triangles.
This commit is contained in:
parent
e873f9cd4e
commit
4bceb5b2b2
@ -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;
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user