0027959: BRepMesh_Delaun produces mesh with gaps on internal edges
authoroan <oan@opencascade.com>
Thu, 20 Oct 2016 13:34:29 +0000 (16:34 +0300)
committerapn <apn@opencascade.com>
Fri, 21 Oct 2016 08:12:08 +0000 (11:12 +0300)
Check both sides of internal link for adjusted triangle and process left and right polygons separately
Small correction of test case for issue CR27959

src/BRepMesh/BRepMesh_Delaun.cxx
src/BRepMesh/BRepMesh_Delaun.hxx
tests/bugs/mesh/bug27959 [new file with mode: 0644]

index edd8a5c..a7e8b48 100644 (file)
@@ -508,25 +508,56 @@ void BRepMesh_Delaun::createTrianglesOnNewVertices(
       createTriangles( aVertexIdx, aLoopEdges );
     }
   }
-  // Check that internal edges are not crossed by triangles
+
+  insertInternalEdges();
+
+  // Adjustment of meshes to boundary edges
+  frontierAdjust();
+}
+
+//=======================================================================
+//function : insertInternalEdges
+//purpose  : 
+//=======================================================================
+void BRepMesh_Delaun::insertInternalEdges()
+{
   BRepMesh::HMapOfInteger anInternalEdges = InternalEdges();
 
   // Destruction of triancles intersecting internal edges 
   // and their replacement by makeshift triangles
+  Standard_Integer e[3];
+  Standard_Boolean o[3];
   BRepMesh::MapOfInteger::Iterator anInernalEdgesIt( *anInternalEdges );
   for ( ; anInernalEdgesIt.More(); anInernalEdgesIt.Next() )
   {
-    Standard_Integer aNbC;
-    aNbC = myMeshData->ElementsConnectedTo( anInernalEdgesIt.Key() ).Extent();
-    if ( aNbC == 0 )
+    const Standard_Integer aLinkIndex = anInernalEdgesIt.Key();
+    const BRepMesh_PairOfIndex& aPair = myMeshData->ElementsConnectedTo(aLinkIndex);
+
+    // Check both sides of link for adjusted triangle.
+    Standard_Boolean isGo[2] = { Standard_True, Standard_True };
+    for (Standard_Integer aTriangleIt = 1; aTriangleIt <= aPair.Extent(); ++aTriangleIt)
     {
-      meshLeftPolygonOf( anInernalEdgesIt.Key(), Standard_True  ); 
-      meshLeftPolygonOf( anInernalEdgesIt.Key(), Standard_False ); 
+      GetTriangle(aPair.Index(aTriangleIt)).Edges(e, o);
+      for (Standard_Integer i = 0; i < 3; ++i)
+      {
+        if (e[i] == aLinkIndex)
+        {
+          isGo[o[i] ? 0 : 1] = Standard_False;
+          break;
+        }
+      }
     }
-  }
 
-  // Adjustment of meshes to boundary edges
-  frontierAdjust();
+    if (isGo[0])
+    {
+      meshLeftPolygonOf(aLinkIndex, Standard_True);
+    }
+
+    if (isGo[1])
+    {
+      meshLeftPolygonOf(aLinkIndex, Standard_False);
+    }
+  }
 }
 
 //=======================================================================
index 37db10c..e8fcba5 100755 (executable)
@@ -320,6 +320,9 @@ private:
                           const Standard_Integer             theStartIndex,
                           const Standard_Integer             theEndIndex) const;
 
+  //! Performs insertion of internal edges into mesh.
+  void insertInternalEdges();
+
 private:
 
   Handle(BRepMesh_DataStructureOfDelaun) myMeshData;
diff --git a/tests/bugs/mesh/bug27959 b/tests/bugs/mesh/bug27959
new file mode 100644 (file)
index 0000000..cdf6fb1
--- /dev/null
@@ -0,0 +1,21 @@
+puts "=========="
+puts "OCC27959"
+puts "=========="
+puts ""
+#######################################################################
+# BRepMesh_Delaun produces mesh with gaps on internal edges
+#######################################################################
+# test for #27959: check that resulting mesh does not contain gaps.
+
+restore [locate_data_file bug27959_ms.brep] result
+
+tclean result
+checkview -display result -3d -path ${imagedir}/${test_image}.png
+
+set log [tricheck result]
+if { [llength $log] != 0 } {
+  puts "Error : Mesh contains gaps"
+} else {
+  puts "OK : Mesh produced without gaps"
+}
+