From 992c358bfff62d2a95b7de65a9c071b15b9ec86a Mon Sep 17 00:00:00 2001 From: LorenzoM Date: Fri, 11 Jun 2021 09:24:27 +0200 Subject: [PATCH] Aggiunto controllo sulla non degenerazione dei triangoli nella triangolazione --- Triangulate.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Triangulate.cpp b/Triangulate.cpp index c24bcdd..a47fcb3 100644 --- a/Triangulate.cpp +++ b/Triangulate.cpp @@ -172,7 +172,7 @@ Triangulate::Make( const POLYLINEVECTOR& vPL, PNTVECTOR& vPt, INTVECTOR& vTr) INTVECTOR vPol ; int n = int( vPt.size()) ; vPol.reserve( n) ; - // non devo gestire separatamente CCW perchè ho già invertito i punti + // non devo gestire separatamente CCW perch� ho gi� invertito i punti for ( int i = 0 ; i < n ; ++ i) vPol.push_back( i) ; @@ -273,7 +273,7 @@ Triangulate::MakeByEC( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& v vTr.push_back( vPol[i]) ; vTr.push_back( vPol[vNext[i]]) ; } - // ‘Delete’ vertex v[i] by redirecting next and previous links + // �Delete� vertex v[i] by redirecting next and previous links // of neighboring verts past it. Decrement vertex count vNext[vPrev[i]] = vNext[i] ; vPrev[vNext[i]] = vPrev[i] ; @@ -394,7 +394,7 @@ Triangulate::MakeByEC2( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& // Reset earity of diagonal endpoints vEar[vPrev[i]] = EAS_NULL ; vEar[vNext[i]] = EAS_NULL ; - // ‘Delete’ vertex v[i] by redirecting next and previous links + // �Delete� vertex v[i] by redirecting next and previous links // of neighboring verts past it. Decrement vertex count vNext[vPrev[i]] = vNext[i] ; vPrev[vNext[i]] = vPrev[i] ; @@ -507,7 +507,7 @@ Triangulate::MakeByEC3( const PNTVECTOR& vPt, const INTVECTOR& vPol, INTVECTOR& // Reset earity of diagonal endpoints vEar[vPrev[i]] = EAS_NULL ; vEar[vNext[i]] = EAS_NULL ; - // ‘Delete’ vertex v[i] by redirecting next and previous links + // �Delete� vertex v[i] by redirecting next and previous links // of neighboring verts past it. Decrement vertex count vNext[vPrev[i]] = vNext[i] ; vPrev[vNext[i]] = vPrev[i] ; @@ -534,7 +534,11 @@ Triangulate::TestTriangle( const PNTVECTOR& vPt, const INTVECTOR& vPol, // Test if current vertex, v[i], is an ear bool bIsEar = true ; // An ear must be convex (here counterclockwise) - if ( TriangleIsCCW( vPt[vPol[vPrev[i]]], vPt[vPol[i]], vPt[vPol[vNext[i]]])) { + if ( TriangleIsCCW( vPt[vPol[vPrev[i]]], vPt[vPol[i]], vPt[vPol[vNext[i]]]) && + ! Collinear( vPt[vPol[vPrev[i]]], vPt[vPol[i]], vPt[vPol[vNext[i]]]) /*&& + ! AreSamePoint( vPt[vPol[vPrev[i]]], vPt[vPol[i]]) && + ! AreSamePoint( vPt[vPol[i]], vPt[vPol[vNext[i]]]) && + ! AreSamePoint( vPt[vPol[vNext[i]]], vPt[vPol[vPrev[i]]])*/ ) { // Loop over all vertices not part of the tentative ear BBox3d b3Tria ; b3Tria.Add( vPt[vPol[vPrev[i]]]) ; @@ -570,7 +574,7 @@ Triangulate::TestTriangle( const PNTVECTOR& vPt, const INTVECTOR& vPol, } } else { - // The ‘ear’ triangle is clockwise so v[i] is not an ear + // The �ear� triangle is clockwise so v[i] is not an ear bIsEar = false ; } @@ -896,14 +900,14 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n break ; } } - // non ho trovato alcunché, errore + // non ho trovato alcunch�, errore if ( nI == - 1) return false ; // se ho trovato un punto esatto del contorno, non devo fare altri controlli if ( AreSamePointApprox( ptInt, vPt[nI])) return true ; // devo ora verificare che il segmento che unisce i punti non intersechi altri lati del contorno esterno - // altrimenti tengo il punto con raggio più vicino a X_AX o Y_AX o Z_AX secondo m_nPlane + // altrimenti tengo il punto con raggio pi� vicino a X_AX o Y_AX o Z_AX secondo m_nPlane int nJ = nI ; Point3d ptPa = ptP ; Point3d ptPb = vPt[nI] ; @@ -919,7 +923,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n double dMinTan = INFINITO ; double dMinSqDist = SQ_INFINITO ; for ( int i = 0 ; i < nNumPt ; ++ i) { - // salto il punto già trovato + // salto il punto gi� trovato if ( i == nJ) continue ; // verifico se sta nel triangolo @@ -955,7 +959,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n bool Triangulate::PointInSector( const Point3d& ptTest, const Point3d& ptPrev, const Point3d& ptCorn, const Point3d& ptNext) { - // la parte valida del settore è a sinistra dei segmenti ptPrev --> ptCorn --> ptNext + // la parte valida del settore � a sinistra dei segmenti ptPrev --> ptCorn --> ptNext // se corner convesso if ( TriangleIsCCW( ptPrev, ptCorn, ptNext, 0)) return ( TriangleIsCCW( ptPrev, ptCorn, ptTest) && @@ -970,10 +974,10 @@ Triangulate::PointInSector( const Point3d& ptTest, const Point3d& ptPrev, const bool ChangeStartPntVector( int nNewStart, PNTVECTOR& vPi) { - // se il nuovo inizio coincide col vecchio, non devo fare alcunché + // se il nuovo inizio coincide col vecchio, non devo fare alcunch� if ( nNewStart == 0) return true ; - // se il nuovo indice è oltre la dimensione del vettore, errore + // se il nuovo indice � oltre la dimensione del vettore, errore if ( nNewStart >= int( vPi.size())) return false ; // ciclo di aggiustamento