diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 5e622f4..92775c7 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/Voronoi.cpp b/Voronoi.cpp index 781cacf..8de6669 100644 --- a/Voronoi.cpp +++ b/Voronoi.cpp @@ -414,6 +414,11 @@ Voronoi::GetBisectorCurve( int i) CurveLine* pLine = CreateBasicCurveLine() ; if ( pLine == nullptr) return nullptr ; + // costruisco il bisettore orientato dal parametro minore al maggiore + if ( dParS > dParE) { + swap( ptS, ptE) ; + swap( dParS, dParE) ; + } pLine->Set( ptS, ptE) ; pLine->SetTempParam( dParS, 0) ; pLine->SetTempParam( dParE, 1) ; @@ -433,7 +438,7 @@ Voronoi::GetBisectorCurve( int i) return nullptr ; pArc->SetC2P( ptC, ptS, ptE) ; pArc->SetTempParam( dParS, 0) ; - pArc->SetTempParam( dParS, 1) ; + pArc->SetTempParam( dParS, 1) ; // dParE = dParS pArc->ToGlob( m_Frame) ; return pArc ; } @@ -449,15 +454,23 @@ Voronoi::GetBisectorCurve( int i) if ( pCompo == nullptr) return nullptr ; + // verifico se devo leggere i punti del bisettore al contrario per averlo orientato dal parametro minore al maggiore + bool bInvert = false ; + double dPar1, dPar2 ; + m_vroni->GetApproxedBisectorParams( i, dPar1, dPar2) ; + if ( dPar1 > dPar2 + EPS_SMALL) + bInvert = true ; + // punto iniziale Point3d pt ; double dParS ; - m_vroni->GetApproxedBisectorPoint( i, 0, pt.v, dParS) ; + m_vroni->GetApproxedBisectorPoint( i, bInvert ? nPoints - 1 : 0, pt.v, dParS) ; pCompo->AddPoint( pt) ; int nCrvCount = 0 ; double dParPrev = dParS ; - for ( int j = 1 ; j < nPoints ; j ++) { + int j = bInvert ? nPoints - 2 : 1 ; + while ( ( bInvert && j >= 0) || ( ! bInvert && j < nPoints)) { double dPar ; m_vroni->GetApproxedBisectorPoint( i, j, pt.v, dPar) ; if ( pCompo->AddLine( pt)) { @@ -467,7 +480,12 @@ Voronoi::GetBisectorCurve( int i) // aggiorno parametro precedente dParPrev = dPar ; nCrvCount ++ ; - } + } + // aggiorno per punto successivo + if ( bInvert) + j -- ; + else + j ++ ; } // setto parametri sulla curva