1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

Compare commits

...

1 Commits

Author SHA1 Message Date
Dzmitry Razmyslovich
c1a8dfe3be 0032254: Refactor frontierAdjust function; Use abs angle 2021-11-29 17:45:02 +01:00
2 changed files with 75 additions and 51 deletions

View File

@@ -377,7 +377,7 @@ void BRepMesh_Delaun::compute(IMeshData::VectorOfInteger& theVertexIndexes)
createTriangles( theVertexIndexes( anVertexIdx ), aLoopEdges ); createTriangles( theVertexIndexes( anVertexIdx ), aLoopEdges );
// Add other nodes to the mesh // Add other nodes to the mesh
createTrianglesOnNewVertices (theVertexIndexes, Message_ProgressRange()); createTrianglesOnNewVertices (theVertexIndexes, Message_ProgressRange(), Standard_True);
} }
RemoveAuxElements (); RemoveAuxElements ();
@@ -544,7 +544,8 @@ void BRepMesh_Delaun::createTriangles(const Standard_Integer theVertexI
//======================================================================= //=======================================================================
void BRepMesh_Delaun::createTrianglesOnNewVertices( void BRepMesh_Delaun::createTrianglesOnNewVertices(
IMeshData::VectorOfInteger& theVertexIndexes, IMeshData::VectorOfInteger& theVertexIndexes,
const Message_ProgressRange& theRange) const Message_ProgressRange& theRange,
Standard_Boolean doFrontierAdjust)
{ {
Handle(NCollection_IncAllocator) aAllocator = Handle(NCollection_IncAllocator) aAllocator =
new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE); new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE);
@@ -633,7 +634,13 @@ void BRepMesh_Delaun::createTrianglesOnNewVertices(
} }
} }
ProcessConstraints(); insertInternalEdges ();
if (doFrontierAdjust)
{
// Adjustment of meshes to boundary edges
frontierAdjust ();
}
} }
//======================================================================= //=======================================================================
@@ -869,67 +876,83 @@ void BRepMesh_Delaun::frontierAdjust()
IMeshData::MapOfIntegerInteger aLoopEdges(10, aAllocator); IMeshData::MapOfIntegerInteger aLoopEdges(10, aAllocator);
Handle(IMeshData::MapOfInteger) aIntFrontierEdges = new IMeshData::MapOfInteger; Handle(IMeshData::MapOfInteger) aIntFrontierEdges = new IMeshData::MapOfInteger;
for ( Standard_Integer aPass = 1; aPass <= 2; ++aPass ) IMeshData::MapOfInteger aTrianglesList;
{ Standard_Boolean isModified = Standard_True;
// 1 pass): find external triangles on boundary edges;
// 2 pass): find external triangles on boundary edges appeared Standard_Integer aPass = 1;
// during triangles replacement.
for ( ; isModified; ++aPass )
IMeshData::IteratorOfMapOfInteger aFrontierIt( *aFrontier ); {
for ( ; aFrontierIt.More(); aFrontierIt.Next() ) isModified = Standard_False;
{ aFailedFrontiers.Clear ();
Standard_Integer aFrontierId = aFrontierIt.Key();
const BRepMesh_PairOfIndex& aPair = myMeshData->ElementsConnectedTo( aFrontierId ); IMeshData::IteratorOfMapOfInteger aFrontierIt (*aFrontier);
Standard_Integer aNbElem = aPair.Extent(); for (; aFrontierIt.More (); aFrontierIt.Next ())
for( Standard_Integer aElemIt = 1; aElemIt <= aNbElem; ++aElemIt ) {
{ Standard_Integer aFrontierId = aFrontierIt.Key ();
const Standard_Integer aPriorElemId = aPair.Index( aElemIt ); const BRepMesh_PairOfIndex& aPair = myMeshData->ElementsConnectedTo (aFrontierId);
if( aPriorElemId < 0 )
continue; for( Standard_Integer j = 1, jn = aPair.Extent(); j <= jn; ++j )
{
const BRepMesh_Triangle& aElement = GetTriangle(aPriorElemId); const Standard_Integer aPriorElemId = aPair.Index(j);
const Standard_Integer(&e)[3] = aElement.myEdges; if( aPriorElemId < 0 )
const Standard_Boolean(&o)[3] = aElement.myOrientations; continue;
Standard_Integer e[3];
Standard_Boolean o[3];
GetTriangle( aPriorElemId ).Edges( e, o );
Standard_Boolean isTriangleFound = Standard_False;
for ( Standard_Integer n = 0; n < 3; ++n ) for ( Standard_Integer n = 0; n < 3; ++n )
{ {
if ( aFrontierId == e[n] && !o[n] ) if ( aFrontierIt.Key() == e[n] && !o[n] )
{ {
// Destruction of external triangles on boundary edges if ( !aTrianglesList.Contains(aPriorElemId) )
isTriangleFound = Standard_True; aTrianglesList.Add( aPriorElemId );
deleteTriangle( aPriorElemId, aLoopEdges );
break; break;
} }
} }
if ( isTriangleFound )
break;
} }
} }
// destruction of external triangles on boundary edges
IMeshData::IteratorOfMapOfInteger anTriangleIt( aTrianglesList );
for ( ; anTriangleIt.More(); anTriangleIt.Next() )
deleteTriangle( anTriangleIt.Key(), aLoopEdges );
aTrianglesList.Clear();
// destrucrion of remaining hanging edges : // destrucrion of remaining hanging edges :
IMeshData::MapOfIntegerInteger::Iterator aLoopEdgesIt( aLoopEdges ); IMeshData::MapOfIntegerInteger::Iterator aLoopEdgesIt (aLoopEdges);
for ( ; aLoopEdgesIt.More(); aLoopEdgesIt.Next() ) for (; aLoopEdgesIt.More (); aLoopEdgesIt.Next ())
{ {
Standard_Integer aLoopEdgeId = aLoopEdgesIt.Key(); Standard_Integer aLoopEdgeId = aLoopEdgesIt.Key ();
if (myMeshData->ElementsConnectedTo( aLoopEdgeId ).IsEmpty() ) if (myMeshData->ElementsConnectedTo (aLoopEdgeId).IsEmpty ())
myMeshData->RemoveLink( aLoopEdgeId ); myMeshData->RemoveLink (aLoopEdgeId);
}
aLoopEdges.Clear ();
// Now analyze the frontier and build the missing triangles
aFrontierIt.Reset ();
for ( ; aFrontierIt.More(); aFrontierIt.Next() )
{
Standard_Integer aFrontierId = aFrontierIt.Key ();
const BRepMesh_Edge& anEdge = GetEdge(aFrontierId);
if ( myMeshData->ElementsConnectedTo(aFrontierId).IsEmpty() && (anEdge.FirstNode() != anEdge.LastNode())) // we fix mesh only for non-zero edges
{
Standard_Boolean isSuccess =
meshLeftPolygonOf (aFrontierId, Standard_True, aIntFrontierEdges);
if (!isSuccess)
aFailedFrontiers.Append (aFrontierId);
else
isModified = Standard_True;
}
} }
// destruction of triangles crossing the boundary edges and aIntFrontierEdges->Clear ();
// their replacement by makeshift triangles
for ( aFrontierIt.Reset(); aFrontierIt.More(); aFrontierIt.Next() )
{
Standard_Integer aFrontierId = aFrontierIt.Key();
if ( !myMeshData->ElementsConnectedTo( aFrontierId ).IsEmpty() )
continue;
Standard_Boolean isSuccess = if ( aPass > 1 ) {
meshLeftPolygonOf( aFrontierId, Standard_True, aIntFrontierEdges ); isModified = Standard_False;
if ( aPass == 2 && !isSuccess )
aFailedFrontiers.Append( aFrontierId );
} }
} }
@@ -1501,7 +1524,7 @@ Standard_Boolean BRepMesh_Delaun::isVertexInsidePolygon(
aPrevVertexDir = aCurVertexDir; aPrevVertexDir = aCurVertexDir;
} }
if ( Abs( Angle2PI - aTotalAng ) > Precision::Angular() ) if ( Abs( Angle2PI - Abs (aTotalAng) ) > Precision::Angular() )
return Standard_False; return Standard_False;
return Standard_True; return Standard_True;

View File

@@ -298,7 +298,8 @@ private:
//! Creates the triangles on new nodes. //! Creates the triangles on new nodes.
void createTrianglesOnNewVertices (IMeshData::VectorOfInteger& theVertexIndices, void createTrianglesOnNewVertices (IMeshData::VectorOfInteger& theVertexIndices,
const Message_ProgressRange& theRange); const Message_ProgressRange& theRange,
Standard_Boolean doFrontierAdjust = Standard_False);
//! Cleanup mesh from the free triangles. //! Cleanup mesh from the free triangles.
void cleanupMesh(); void cleanupMesh();