EgtGeomKernel :
- modifiche a chain - correzioni a PointGrid3d.
This commit is contained in:
+39
-19
@@ -54,7 +54,7 @@ ChainCurves::AddCurve( int nId, const Point3d& ptStart, const Vector3d& vtStart,
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool
|
bool
|
||||||
ChainCurves::GetChainFromNear( const Point3d& ptStart, INTVECTOR& vIds)
|
ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECTOR& vIds)
|
||||||
{
|
{
|
||||||
// pulisco il risultato
|
// pulisco il risultato
|
||||||
vIds.clear() ;
|
vIds.clear() ;
|
||||||
@@ -75,15 +75,21 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, INTVECTOR& vIds)
|
|||||||
|
|
||||||
// concateno dopo la fine dell'entità di partenza
|
// concateno dopo la fine dell'entità di partenza
|
||||||
INTVECTOR vIdsAfter ;
|
INTVECTOR vIdsAfter ;
|
||||||
if ( ! GetChainFromPoint( m_vCrvData[nId].ptEnd, m_vCrvData[nId].vtEnd, false, vIdsAfter))
|
bool bClosed ;
|
||||||
|
if ( ! GetChainFromPoint( m_vCrvData[nId].ptEnd, m_vCrvData[nId].vtEnd,
|
||||||
|
m_vCrvData[nId].ptStart, bHaltOnFork, vIdsAfter, bClosed))
|
||||||
return false ;
|
return false ;
|
||||||
|
|
||||||
// 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 ;
|
INTVECTOR vIdsBefore ;
|
||||||
if ( ! GetReverseChainFromPoint( m_vCrvData[nId].ptStart, m_vCrvData[nId].vtStart, false, vIdsBefore))
|
if ( ! bClosed) {
|
||||||
return false ;
|
bool bRevClosed ;
|
||||||
// inverto l'ordine
|
if ( ! GetReverseChainFromPoint( m_vCrvData[nId].ptStart, m_vCrvData[nId].vtStart,
|
||||||
reverse( vIdsBefore.begin(), vIdsBefore.end()) ;
|
m_vCrvData[nId].ptEnd, bHaltOnFork, vIdsBefore, bRevClosed))
|
||||||
|
return false ;
|
||||||
|
// inverto l'ordine
|
||||||
|
reverse( vIdsBefore.begin(), vIdsBefore.end()) ;
|
||||||
|
}
|
||||||
|
|
||||||
// inserisco i risultati nel vettore complessivo
|
// inserisco i risultati nel vettore complessivo
|
||||||
vIds.reserve( vIdsBefore.size() + 1 + vIdsAfter.size()) ;
|
vIds.reserve( vIdsBefore.size() + 1 + vIdsAfter.size()) ;
|
||||||
@@ -96,11 +102,13 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, INTVECTOR& vIds)
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool
|
bool
|
||||||
ChainCurves::GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart, bool bStopOnFork,
|
ChainCurves::GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart,
|
||||||
INTVECTOR& vIds)
|
const Point3d& ptStop, bool bHaltOnFork,
|
||||||
|
INTVECTOR& vIds, bool& bStopped)
|
||||||
{
|
{
|
||||||
// pulisco il risultato
|
// pulisco il risultato
|
||||||
vIds.clear() ;
|
vIds.clear() ;
|
||||||
|
bStopped = false ;
|
||||||
m_bIsFork = false ;
|
m_bIsFork = false ;
|
||||||
m_vFork.clear() ;
|
m_vFork.clear() ;
|
||||||
|
|
||||||
@@ -110,7 +118,7 @@ ChainCurves::GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart,
|
|||||||
int nNext ;
|
int nNext ;
|
||||||
INTVECTOR vNext ;
|
INTVECTOR vNext ;
|
||||||
while ( m_PointGrid.Find( ptCurr, m_dToler, vNext) &&
|
while ( m_PointGrid.Find( ptCurr, m_dToler, vNext) &&
|
||||||
ChooseNext( vtCurr, vNext, bStopOnFork, nNext)) {
|
ChooseNext( vtCurr, vNext, bHaltOnFork, nNext)) {
|
||||||
// recupero indice e verso
|
// recupero indice e verso
|
||||||
int nId = abs( nNext) - 1 ;
|
int nId = abs( nNext) - 1 ;
|
||||||
bool bEquiv = ( nNext > 0) ;
|
bool bEquiv = ( nNext > 0) ;
|
||||||
@@ -121,6 +129,11 @@ ChainCurves::GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart,
|
|||||||
// determino il prossimo inizio
|
// determino il prossimo inizio
|
||||||
ptCurr = bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart ;
|
ptCurr = bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart ;
|
||||||
vtCurr = bEquiv ? m_vCrvData[nId].vtEnd : - m_vCrvData[nId].vtStart ;
|
vtCurr = bEquiv ? m_vCrvData[nId].vtEnd : - m_vCrvData[nId].vtStart ;
|
||||||
|
// verifico se sono arrivato al punto di chiusura
|
||||||
|
if ( AreSamePointEpsilon( ptCurr, ptStop, m_dToler)) {
|
||||||
|
bStopped = true ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true ;
|
return true ;
|
||||||
@@ -128,11 +141,13 @@ ChainCurves::GetChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart,
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool
|
bool
|
||||||
ChainCurves::GetReverseChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart, bool bStopOnFork,
|
ChainCurves::GetReverseChainFromPoint( const Point3d& ptStart, const Vector3d& vtStart,
|
||||||
INTVECTOR& vIds)
|
const Point3d& ptStop, bool bHaltOnFork,
|
||||||
|
INTVECTOR& vIds, bool& bStopped)
|
||||||
{
|
{
|
||||||
// pulisco il risultato
|
// pulisco il risultato
|
||||||
vIds.clear() ;
|
vIds.clear() ;
|
||||||
|
bStopped = false ;
|
||||||
m_bIsFork = false ;
|
m_bIsFork = false ;
|
||||||
m_vFork.clear() ;
|
m_vFork.clear() ;
|
||||||
|
|
||||||
@@ -142,7 +157,7 @@ ChainCurves::GetReverseChainFromPoint( const Point3d& ptStart, const Vector3d& v
|
|||||||
int nPrev ;
|
int nPrev ;
|
||||||
INTVECTOR vPrev ;
|
INTVECTOR vPrev ;
|
||||||
while ( m_PointGrid.Find( ptCurr, m_dToler, vPrev) &&
|
while ( m_PointGrid.Find( ptCurr, m_dToler, vPrev) &&
|
||||||
ChoosePrev( vtCurr, vPrev, bStopOnFork, nPrev)) {
|
ChoosePrev( vtCurr, vPrev, bHaltOnFork, nPrev)) {
|
||||||
// recupero indice e verso
|
// recupero indice e verso
|
||||||
int nId = abs( nPrev) - 1 ;
|
int nId = abs( nPrev) - 1 ;
|
||||||
bool bEquiv = ( nPrev < 0) ;
|
bool bEquiv = ( nPrev < 0) ;
|
||||||
@@ -153,6 +168,11 @@ ChainCurves::GetReverseChainFromPoint( const Point3d& ptStart, const Vector3d& v
|
|||||||
// determino il prossimo inizio
|
// determino il prossimo inizio
|
||||||
ptCurr = bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd ;
|
ptCurr = bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd ;
|
||||||
vtCurr = bEquiv ? m_vCrvData[nId].vtStart : - m_vCrvData[nId].vtEnd ;
|
vtCurr = bEquiv ? m_vCrvData[nId].vtStart : - m_vCrvData[nId].vtEnd ;
|
||||||
|
// verifico se sono arrivato al punto di stop
|
||||||
|
if ( AreSamePointEpsilon( ptCurr, ptStop, m_dToler)) {
|
||||||
|
bStopped = true ;
|
||||||
|
break ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true ;
|
return true ;
|
||||||
@@ -221,7 +241,7 @@ ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int&
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool
|
bool
|
||||||
ChainCurves::ChooseNext( const Vector3d& vtCurr, const INTVECTOR& vNext, bool bStopOnFork, int& nNext)
|
ChainCurves::ChooseNext( const Vector3d& vtCurr, const INTVECTOR& vNext, bool bHaltOnFork, int& nNext)
|
||||||
{
|
{
|
||||||
// cerco la direzione più vicina
|
// cerco la direzione più vicina
|
||||||
int nI = - 1 ;
|
int nI = - 1 ;
|
||||||
@@ -236,7 +256,7 @@ ChainCurves::ChooseNext( const Vector3d& vtCurr, const INTVECTOR& vNext, bool bS
|
|||||||
continue ;
|
continue ;
|
||||||
// incremento contatore indice entità tra cui scegliere
|
// incremento contatore indice entità tra cui scegliere
|
||||||
++ nF ;
|
++ nF ;
|
||||||
if ( bStopOnFork)
|
if ( bHaltOnFork)
|
||||||
m_vFork.push_back( vNext[i]) ;
|
m_vFork.push_back( vNext[i]) ;
|
||||||
// determino scarto angolare
|
// determino scarto angolare
|
||||||
Vector3d vtDir = ( bEquiv ? m_vCrvData[nId].vtStart : - m_vCrvData[nId].vtEnd) ;
|
Vector3d vtDir = ( bEquiv ? m_vCrvData[nId].vtStart : - m_vCrvData[nId].vtEnd) ;
|
||||||
@@ -254,7 +274,7 @@ ChainCurves::ChooseNext( const Vector3d& vtCurr, const INTVECTOR& vNext, bool bS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// se richiesto arresto su biforcazione e trovata biforcazione
|
// se richiesto arresto su biforcazione e trovata biforcazione
|
||||||
if ( bStopOnFork && nF > 1) {
|
if ( bHaltOnFork && nF > 1) {
|
||||||
m_bIsFork = true ;
|
m_bIsFork = true ;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
@@ -267,7 +287,7 @@ ChainCurves::ChooseNext( const Vector3d& vtCurr, const INTVECTOR& vNext, bool bS
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool
|
bool
|
||||||
ChainCurves::ChoosePrev( const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bStopOnFork, int& nPrev)
|
ChainCurves::ChoosePrev( const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bHaltOnFork, int& nPrev)
|
||||||
{
|
{
|
||||||
// cerco la direzione più vicina
|
// cerco la direzione più vicina
|
||||||
int nI = - 1 ;
|
int nI = - 1 ;
|
||||||
@@ -282,7 +302,7 @@ ChainCurves::ChoosePrev( const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bS
|
|||||||
continue ;
|
continue ;
|
||||||
// incremento contatore indice entità tra cui scegliere
|
// incremento contatore indice entità tra cui scegliere
|
||||||
++ nF ;
|
++ nF ;
|
||||||
if ( bStopOnFork)
|
if ( bHaltOnFork)
|
||||||
m_vFork.push_back( vPrev[i]) ;
|
m_vFork.push_back( vPrev[i]) ;
|
||||||
// determino scarto angolare
|
// determino scarto angolare
|
||||||
Vector3d vtDir = ( bEquiv ? m_vCrvData[nId].vtEnd : - m_vCrvData[nId].vtStart) ;
|
Vector3d vtDir = ( bEquiv ? m_vCrvData[nId].vtEnd : - m_vCrvData[nId].vtStart) ;
|
||||||
@@ -300,7 +320,7 @@ ChainCurves::ChoosePrev( const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// se richiesto arresto su biforcazione e trovata biforcazione
|
// se richiesto arresto su biforcazione e trovata biforcazione
|
||||||
if ( bStopOnFork && nF > 1) {
|
if ( bHaltOnFork && nF > 1) {
|
||||||
m_bIsFork = true ;
|
m_bIsFork = true ;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5115,7 +5115,7 @@ GdbExecutor::CurveCopyByChain( const STRVECTOR& vsParams)
|
|||||||
}
|
}
|
||||||
// recupero i percorsi concatenati
|
// recupero i percorsi concatenati
|
||||||
INTVECTOR vIds ;
|
INTVECTOR vIds ;
|
||||||
while ( chainC.GetChainFromNear( ptNearStart, vIds)) {
|
while ( chainC.GetChainFromNear( ptNearStart, false, vIds)) {
|
||||||
// creo una curva composita
|
// creo una curva composita
|
||||||
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
|
||||||
if ( IsNull( pCrvCompo))
|
if ( IsNull( pCrvCompo))
|
||||||
|
|||||||
+1
-1
@@ -292,7 +292,7 @@ PointGrid3d::FindNearest( const Point3d& ptTest, INTVECTOR& vnIds)
|
|||||||
// se distanza inferiore al minimo, aggiorno...
|
// se distanza inferiore al minimo, aggiorno...
|
||||||
double dSqDist = SqDist( (*MMrange.first).second.first, ptTest) ;
|
double dSqDist = SqDist( (*MMrange.first).second.first, ptTest) ;
|
||||||
// altro punto con la stessa minima distanza già trovata
|
// altro punto con la stessa minima distanza già trovata
|
||||||
if ( bFound && fabs( dSqDist - dSqMinDist) < 2 * dMinDist * NEAR_TOL) {
|
if ( bFound && fabs( dSqDist - dSqMinDist) < 2 * dMinDist * NEAR_TOL + NEAR_TOL * NEAR_TOL) {
|
||||||
// inserisco il punto nel vettore dei risultati
|
// inserisco il punto nel vettore dei risultati
|
||||||
vnIds.push_back( (*MMrange.first).second.second) ;
|
vnIds.push_back( (*MMrange.first).second.second) ;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user