EgtGeomKernel 1.6h3 :
- migliorata approssimazione curve per riconoscimento di tratti rettilinei - aggiunta CopyMaterial a GeomDB - correzioni a IntersCurveCurve per le curve approssimate - aggiunte a Intervals Union, Intersection e Difference - correzioni a SelfIntersCurve per curve approssimate - aggiunte funzioni di creazione Regioni (Rectangle, Stadium, Disk e da zuppa di curve) - migliorie varie a Regioni e introduzione dei componenti connessi (chunk).
This commit is contained in:
+37
-19
@@ -82,6 +82,10 @@ CurveByApprox::GetArcs( double dLinTol, double dAngTolDeg, double dLinFea, PolyA
|
||||
// pulisco il poliarco
|
||||
PA.Clear() ;
|
||||
|
||||
// calcolo una parametrizzazione
|
||||
if ( ! CalcParameterization())
|
||||
return false ;
|
||||
|
||||
// calcolo le tangenti
|
||||
if ( ! CalcAkimaTangents( true))
|
||||
return false ;
|
||||
@@ -109,12 +113,10 @@ CurveByApprox::GetArcs( double dLinTol, double dAngTolDeg, double dLinFea, PolyA
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveByApprox::CalcAkimaTangents( bool bDetectCorner)
|
||||
CurveByApprox::CalcParameterization( void)
|
||||
{
|
||||
// pulisco i vettori dei parametri e delle tangenti
|
||||
// pulisco il vettore dei parametri
|
||||
m_vPar.clear() ;
|
||||
m_vPrevDer.clear() ;
|
||||
m_vNextDer.clear() ;
|
||||
|
||||
// numero di punti
|
||||
int nSize = int( m_vPnt.size()) ;
|
||||
@@ -133,6 +135,24 @@ CurveByApprox::CalcAkimaTangents( bool bDetectCorner)
|
||||
m_vPar.push_back( dPar) ;
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveByApprox::CalcAkimaTangents( bool bDetectCorner)
|
||||
{
|
||||
// pulisco i vettori delle tangenti
|
||||
m_vPrevDer.clear() ;
|
||||
m_vNextDer.clear() ;
|
||||
|
||||
// numero di punti
|
||||
int nSize = int( m_vPnt.size()) ;
|
||||
|
||||
// sono necessari almeno due punti
|
||||
if ( nSize < 2)
|
||||
return false ;
|
||||
|
||||
// calcolo le derivate
|
||||
m_vPrevDer.reserve( nSize) ;
|
||||
m_vNextDer.reserve( nSize) ;
|
||||
@@ -254,8 +274,7 @@ CurveByApprox::CalcAkimaTangents( bool bDetectCorner)
|
||||
bool
|
||||
CurveByApprox::CalcBesselTangents( void)
|
||||
{
|
||||
// pulisco i vettori dei parametri e delle tangenti
|
||||
m_vPar.clear() ;
|
||||
// pulisco i vettori delle tangenti
|
||||
m_vPrevDer.clear() ;
|
||||
m_vNextDer.clear() ;
|
||||
|
||||
@@ -266,16 +285,6 @@ CurveByApprox::CalcBesselTangents( void)
|
||||
if ( nSize < 2)
|
||||
return false ;
|
||||
|
||||
// calcolo le distanze tra i punti per derivarne i parametri
|
||||
m_vPar.reserve( nSize) ;
|
||||
double dPar = 0 ;
|
||||
m_vPar.push_back( dPar) ;
|
||||
for ( int i = 1 ; i < nSize ; ++ i) {
|
||||
double dDist = Dist( m_vPnt[i-1], m_vPnt[i]) ;
|
||||
dPar += dDist ;
|
||||
m_vPar.push_back( dPar) ;
|
||||
}
|
||||
|
||||
// calcolo le derivate
|
||||
m_vPrevDer.reserve( nSize) ;
|
||||
m_vNextDer.reserve( nSize) ;
|
||||
@@ -349,24 +358,33 @@ CurveByApprox::CalcSplitPoints( double dLinTol, double dAngTolDeg, double dLinFe
|
||||
// precalcolo funzioni dei limiti
|
||||
double dSqLinTol = dLinTol * dLinTol ;
|
||||
double dAngTolCos = cos( max( dAngTolDeg, 0.) * DEGTORAD) ;
|
||||
double d2AngTolCos = cos( max( 2 * dAngTolDeg, 0.) * DEGTORAD) ;
|
||||
double dSqLinFea = dLinFea * dLinFea ;
|
||||
// cerco punti angolosi e punti di separazione di tratti lineari e non
|
||||
// verifico i punti tranne primo e ultimo
|
||||
int nSize = int( m_vPnt.size()) ;
|
||||
for ( int i = 1 ; i < nSize - 1 ; ++ i) {
|
||||
// se angolo, allora punto di divisione
|
||||
// se stimato angolo, allora punto di divisione
|
||||
if ( ( m_vPrevDer[i] * m_vNextDer[i]) < dAngTolCos) {
|
||||
m_vSplits.push_back(i) ;
|
||||
continue ;
|
||||
}
|
||||
// verifico linearità del tratto precedente
|
||||
// dati sui segmenti precedente e successivo
|
||||
Vector3d vtPrev = m_vPnt[i] - m_vPnt[i-1] ;
|
||||
double dLenPrev = m_vPar[i] - m_vPar[i-1] ;
|
||||
Vector3d vtNext = m_vPnt[i+1] - m_vPnt[i] ;
|
||||
double dLenNext = m_vPar[i+1] - m_vPar[i] ;
|
||||
// se i segmenti formano un angolo maggiore del doppio ammesso, allora punto di divisione
|
||||
if ( ( vtPrev * vtNext) / ( dLenPrev * dLenNext) < d2AngTolCos) {
|
||||
m_vSplits.push_back(i) ;
|
||||
continue ;
|
||||
}
|
||||
// verifico linearità del tratto precedente
|
||||
bool bPrevLin = vtPrev.SqLen() > dSqLinFea &&
|
||||
( m_vNextDer[i-1] * m_vPrevDer[i]) > dAngTolCos &&
|
||||
( vtPrev ^ m_vNextDer[i-1]).SqLen() < dSqLinTol &&
|
||||
( vtPrev ^ m_vPrevDer[i]).SqLen() < dSqLinTol ;
|
||||
// verifico linearità del tratto successivo
|
||||
Vector3d vtNext = m_vPnt[i+1] - m_vPnt[i] ;
|
||||
bool bNextLin = vtNext.SqLen() > dSqLinFea &&
|
||||
( m_vNextDer[i] * m_vPrevDer[i+1]) > dAngTolCos &&
|
||||
( vtNext ^ m_vNextDer[i]).SqLen() < dSqLinTol &&
|
||||
|
||||
Reference in New Issue
Block a user