From 9263dc0516084b7c58ce7ce18dd168da06b51ce2 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 5 Mar 2025 12:21:50 +0100 Subject: [PATCH] - modifica alla scelta del punto di start per le compo create come chain. --- ChainCurves.cpp | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/ChainCurves.cpp b/ChainCurves.cpp index a84874b..01eface 100644 --- a/ChainCurves.cpp +++ b/ChainCurves.cpp @@ -2,7 +2,7 @@ // EgalTech 2013-2014 //---------------------------------------------------------------------------- // File : ChainCurves.cpp Data : 20.07.14 Versione : 1.5g3 -// Contenuto : Implementazione della funzione ChainCurves, per creare una o più +// Contenuto : Implementazione della funzione ChainCurves, per creare una o più // curve composite a partire dalle curve date. // // @@ -43,10 +43,10 @@ bool ChainCurves::AddCurve( int nId, const Point3d& ptStart, const Vector3d& vtStart, const Point3d& ptEnd, const Vector3d& vtEnd) { - // verifico validità Id + // verifico validità Id if ( nId <= 0) return false ; - // verifico non sia già stata aggiunta la stessa entità + // verifico non sia già stata aggiunta la stessa entità if ( ! m_sCrvId.insert( nId).second) return true ; // inserisco i dati della curva nel vettore @@ -68,7 +68,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT m_bIsFork = false ; m_vFork.clear() ; - // recupero l'entità più vicina al punto di start + // recupero l'entità più vicina al punto di start int nStart ; INTVECTOR vStart ; if ( ! m_PointGrid.FindNearest( ptStart, vStart) || @@ -82,7 +82,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT // tolgo dal grid RemoveEntityFromGrid( nId) ; - // se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione + // se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione bool bSkip = false ; if ( bHaltOnFork) { auto iIter = GetForkPoint( m_vCrvData[nId].ptEnd) ; @@ -93,7 +93,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT } } - // concateno dopo la fine dell'entità di partenza + // concateno dopo la fine dell'entità di partenza INTVECTOR vIdsAfter ; bool bClosed = false ; if ( ! bSkip && ! GetChainFromPoint( m_vCrvData[nId].ptEnd, m_vCrvData[nId].vtEnd, @@ -102,7 +102,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT return false ; } - // se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione + // se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione bool bRevSkip = false ; if ( bHaltOnFork) { auto iIter = GetForkPoint( m_vCrvData[nId].ptStart) ; @@ -113,7 +113,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT } } - // se non ho già chiuso l'anello, concateno prima dell'inizio dell'entità di partenza + // se non ho già chiuso l'anello, concateno prima dell'inizio dell'entità di partenza INTVECTOR vIdsBefore ; if ( ! bClosed) { bool bRevClosed ; @@ -258,7 +258,7 @@ ChainCurves::RemoveEntityFromGrid( int nId) bool ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int& nStart) { - // numero di entità candidate + // numero di entità candidate int nSize = int( vStart.size()) ; // se nessuna, errore @@ -282,7 +282,10 @@ ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int& Point3d ptNear = ( bEquiv ? m_vCrvData[nId].ptStart + m_vCrvData[nId].vtStart : m_vCrvData[nId].ptEnd - m_vCrvData[nId].vtEnd) ; double dSqDist = SqDist( ptStart, ptNear) ; - if ( dSqDist < dSqDistMin) { + // tengo il segmento più vicino al punto + // favorendo eventualmente quello equiverso se entro EPS da un concorrente + if ( dSqDist < dSqDistMin - EPS_SMALL || + ((dSqDist < dSqDistMin + EPS_SMALL) && bEquiv && vStart[nI] < 0)) { dSqDistMin = dSqDist ; nI = i ; } @@ -302,7 +305,7 @@ bool ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vNext, bool bHaltOnFork, int& nNext) { INTVECTOR vMyNext = vNext ; - // scarto quelle entità che sono più vicine all'altro estremo del più vicino + // scarto quelle entità che sono più vicine all'altro estremo del più vicino int nM = -1 ; Point3d ptRef ; double dSqMinDist = m_dToler * m_dToler ; @@ -319,19 +322,19 @@ ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const IN } } for ( int i = 0 ; i < int( vMyNext.size()) ; ++ i) { - // salto l'entità più vicina + // salto l'entità più vicina if ( i == nM) continue ; // recupero indice e verso int nId = abs( vMyNext[i]) - 1 ; bool bEquiv = ( vMyNext[i] > 0) ; - // verifico se più vicino al più vicino + // verifico se più vicino al più vicino double dCurrSqDist = SqDist( ptCurr, ( bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd)) ; double dRefSqDist = SqDist( ptRef, ( bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd)) ; if ( dRefSqDist < dCurrSqDist) vMyNext[i] = 0 ; } - // cerco la direzione più vicina + // cerco la direzione più vicina int nI = -1 ; int nF = 0 ; INTVECTOR vFork ; @@ -343,7 +346,7 @@ ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const IN // recupero indice e verso int nId = abs( vMyNext[i]) - 1 ; bool bEquiv = ( vMyNext[i] > 0) ; - // incremento contatore indice entità tra cui scegliere + // incremento contatore indice entità tra cui scegliere ++ nF ; vFork.push_back( vMyNext[i]) ; // se vietata inversione, salto se controverso @@ -387,7 +390,7 @@ bool ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bHaltOnFork, int& nPrev) { INTVECTOR vMyPrev = vPrev ; - // scarto quelle entità che sono più vicine all'altro estremo del più vicino + // scarto quelle entità che sono più vicine all'altro estremo del più vicino int nM = -1 ; Point3d ptRef ; double dSqMinDist = m_dToler * m_dToler ; @@ -404,19 +407,19 @@ ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const IN } } for ( int i = 0 ; i < int( vMyPrev.size()) ; ++ i) { - // salto l'entità più vicina + // salto l'entità più vicina if ( i == nM) continue ; // recupero indice e verso int nId = abs( vMyPrev[i]) - 1 ; bool bEquiv = ( vMyPrev[i] < 0) ; - // verifico se più vicino al più vicino + // verifico se più vicino al più vicino double dCurrSqDist = SqDist( ptCurr, ( bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart)) ; double dRefSqDist = SqDist( ptRef, ( bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart)) ; if ( dRefSqDist < dCurrSqDist) vMyPrev[i] = 0 ; } - // cerco la direzione più vicina + // cerco la direzione più vicina int nI = - 1 ; int nF = 0 ; double dProScaMax = - 1.1 ; @@ -428,7 +431,7 @@ ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const IN // recupero indice e verso int nId = abs( vMyPrev[i]) - 1 ; bool bEquiv = ( vMyPrev[i] < 0) ; - // incremento contatore indice entità tra cui scegliere + // incremento contatore indice entità tra cui scegliere ++ nF ; vFork.push_back( vMyPrev[i]) ; // se vietata inversione, salto se controverso