diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index c207da5..392cc97 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -1241,83 +1241,54 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT } Polygon3d pgPol ; - pgPol.FromPolyLine( vPolygons[1]) ; + pgPol.FromPolyLine(vPolygons[1]) ; - if ( trTria.GetN() * pgPol.GetVersN() > 0.) { + bool bCodirectedNormals = trTria.GetN() * pgPol.GetVersN() > 0. ; + if ( bCodirectedNormals) { for ( int nL = 1 ; nL < int( vPolygons.size()) ; ++ nL) { vPolygons[nL].Invert() ; } + } - PNTVECTOR vPt ; - INTVECTOR vTr ; - if ( Triangulate().Make( vPolygons, vPt, vTr)) { - // Inserisco i nuovi triangoli - for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { - int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] }; - int nNewId[3] = { Surf.AddVertex(vPt[nNewTriaVertId[0]]), - Surf.AddVertex(vPt[nNewTriaVertId[1]]), - Surf.AddVertex(vPt[nNewTriaVertId[2]]) } ; - int nNewTriaNum = Surf.AddTriangle( nNewId) ; - if ( IsValidSvt( nNewTriaNum)) { + PNTVECTOR vPt ; + INTVECTOR vTr ; + if ( Triangulate().Make( vPolygons, vPt, vTr)) { + // Inserisco i nuovi triangoli + for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { + int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; + int nNewId[3] = { Surf.AddVertex( vPt[nNewTriaVertId[0]]), + Surf.AddVertex( vPt[nNewTriaVertId[1]]), + Surf.AddVertex( vPt[nNewTriaVertId[2]])} ; + int nNewTriaNum = Surf.AddTriangle( nNewId) ; + if ( IsValidSvt( nNewTriaNum)) { + if ( bCodirectedNormals) Surf.m_vTria[nNewTriaNum].nTempPart = -1 ; - bModif = true ; - } - } - } - - for ( int nL = 1 ; nL < int( vPolygons.size()) ; ++ nL) { - vPolygons[nL].Invert() ; - if ( Triangulate().Make( vPolygons[nL], vPt, vTr)) { - // Inserisco i nuovi triangoli - for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { - int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; - int nNewId[3] = { Surf.AddVertex(vPt[nNewTriaVertId[0]]), - Surf.AddVertex(vPt[nNewTriaVertId[1]]), - Surf.AddVertex(vPt[nNewTriaVertId[2]]) } ; - int nNewTriaNum = Surf.AddTriangle( nNewId) ; - if ( IsValidSvt( nNewTriaNum)) { - Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; - bModif = true ; - } - } + else + Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; + bModif = true ; } } } - else { - PNTVECTOR vPt ; - INTVECTOR vTr ; - if ( Triangulate().Make( vPolygons, vPt, vTr)) { + + for ( int nL = 1 ; nL < int( vPolygons.size()) ; ++ nL) { + vPolygons[nL].Invert() ; + if ( Triangulate().Make( vPolygons[nL], vPt, vTr)) { // Inserisco i nuovi triangoli - for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { - int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; - int nNewId[3] = { Surf.AddVertex(vPt[nNewTriaVertId[0]]), - Surf.AddVertex(vPt[nNewTriaVertId[1]]), - Surf.AddVertex(vPt[nNewTriaVertId[2]]) } ; + for (int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { + int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; + int nNewId[3] = { Surf.AddVertex( vPt[nNewTriaVertId[0]]), + Surf.AddVertex( vPt[nNewTriaVertId[1]]), + Surf.AddVertex( vPt[nNewTriaVertId[2]])} ; int nNewTriaNum = Surf.AddTriangle( nNewId) ; if ( IsValidSvt( nNewTriaNum)) { - Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; + if ( bCodirectedNormals) + Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; + else + Surf.m_vTria[nNewTriaNum].nTempPart = -1 ; bModif = true ; } } } - - for ( int nL = 1 ; nL < int( vPolygons.size()) ; ++ nL) { - vPolygons[nL].Invert() ; - if ( Triangulate().Make( vPolygons[nL], vPt, vTr)) { - // Inserisco i nuovi triangoli - for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { - int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2] } ; - int nNewId[3] = { Surf.AddVertex(vPt[nNewTriaVertId[0]]), - Surf.AddVertex(vPt[nNewTriaVertId[1]]), - Surf.AddVertex(vPt[nNewTriaVertId[2]]) } ; - int nNewTriaNum = Surf.AddTriangle( nNewId) ; - if ( IsValidSvt( nNewTriaNum)) { - Surf.m_vTria[nNewTriaNum].nTempPart = - 1 ; - bModif = true ; - } - } - } - } } } vInnerLoop.resize( 0) ; @@ -1439,6 +1410,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) else bIntOnEndgeA = true ; + swap( CurInters.ptSt, CurInters.ptEn) ; CurInters.vtOuter = trTriaA.GetN() ; CurInters.vtOuter -= ( ( CurInters.vtOuter * trTriaB.GetN()) * trTriaB.GetN()) ; CurInters.vtOuter.Normalize() ;