- modifica alla scelta del punto di start per le compo create come chain.

This commit is contained in:
Daniele Bariletti
2025-03-05 12:21:50 +01:00
parent 730dd396f4
commit 9263dc0516
+23 -20
View File
@@ -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