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:
Dario Sassi
2015-08-18 07:30:08 +00:00
parent f4b88af3e1
commit bab45eb4f3
28 changed files with 1049 additions and 346 deletions
+37 -19
View File
@@ -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 &&