diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 2977fe3..e2968cf 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/PolyLine.cpp b/PolyLine.cpp index 6ee20f4..b3a5490 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -136,6 +136,8 @@ PolyLine::GetFirstUPoint( double* pdPar, Point3d* pptP) const bool PolyLine::GetNextUPoint( double* pdPar, Point3d* pptP, bool bNotLast) const { + if ( m_iter == m_lUPoints.end()) + return false ; ++ m_iter ; if ( m_iter == m_lUPoints.end()) return false ; diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index a50cd1b..6fb94e2 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -1,13 +1,13 @@ //---------------------------------------------------------------------------- // EgalTech 2013-2014 //---------------------------------------------------------------------------- -// File : SurfTriMesh.cpp Data : 26.03.14 Versione : 1.5c9 +// File : SurfTriMesh.cpp Data : 15.05.14 Versione : 1.5e5 // Contenuto : Implementazione della classe Superfici TriMesh. // // // // Modifiche : 26.03.14 DS Creazione modulo. -// +// 15.05.15 DS Corr. errore CreateByTwoCurves che dava loop infinito. // //---------------------------------------------------------------------------- @@ -936,8 +936,8 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2) } // ciclo sui punti while ( bNext1 || bNext2) { - // se la diagonale più corta è dA2p -> dA1s - if ( ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) { + // se c'è nuovo dA1s e la diagonale più corta è dA2p -> dA1s oppure non c'è dA2s + if ( ( bNext1 && ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) || ! bNext2) { // inserisco il vertice A1s if ( ( nV1s = AddVertex( ptP1s)) == SVT_NULL) return false ; @@ -1057,16 +1057,16 @@ SurfTriMesh::VerifyPolylinesForTwoCurves( const PolyLine& PL1, const PolyLine& P // ciclo sui punti double dA1p ; double dU1p ; Point3d ptP1p ; double dA1s ; double dU1s ; Point3d ptP1s ; - bool bNext1 = PL1.GetFirstUPoint( &dU1p, &ptP1p) && PL1.GetNextUPoint( &dU1s, &ptP1s) ; + bool bNext1 = PL1.GetFirstUPoint( &dU1p, &ptP1p) && PL1.GetNextUPoint( &dU1s, &ptP1s, true) ; if ( ! bNext1) - return false ; + return true ; dA1p = 0 ; dA1s = ( dU1s - dU1F) / dDeltaU1 ; double dA2p ; double dU2s ; Point3d ptP2s ; double dA2s ; double dU2p ; Point3d ptP2p ; - bool bNext2 = PL2.GetFirstUPoint( &dU2p, &ptP2p) && PL2.GetNextUPoint( &dU2s, &ptP2s) ; + bool bNext2 = PL2.GetFirstUPoint( &dU2p, &ptP2p) && PL2.GetNextUPoint( &dU2s, &ptP2s, true) ; if ( ! bNext2) - return false ; + return true ; dA2p = 0 ; dA2s = ( dU2s - dU2F) / dDeltaU2 ; // se chiuse, verifico la coincidenza dell'inizio delle due curve @@ -1074,8 +1074,8 @@ SurfTriMesh::VerifyPolylinesForTwoCurves( const PolyLine& PL1, const PolyLine& P return false ; // verifiche sui punti successivi (non sugli ultimi) while ( bNext1 || bNext2) { - // se la diagonale più corta è dA2p -> dA1s - if ( ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) { + // se c'è nuovo dA1s e la diagonale più corta è dA2p -> dA1s oppure non c'è dA2s + if ( ( bNext1 && ( dA1s - dA2p) <= ( dA2s - dA1p) + EPS_PARAM) || ! bNext2) { // verifico se coincidono if ( AreSamePointNear( ptP2p, ptP1s)) return false ;