EgtGeomKernel :

- piccole migliorie per PCA di curve composite
- si evitano triangolazioni di poligoni con 2 soli lati (segmenti sovrapposti va e vieni).
This commit is contained in:
DarioS
2023-01-09 10:14:29 +01:00
parent e01941644b
commit 368bd80c69
3 changed files with 12 additions and 13 deletions
+4 -11
View File
@@ -2035,10 +2035,6 @@ CurveArc::Flip( void)
//----------------------------------------------------------------------------
ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const CurveArc& arArc)
{
int nStep ;
double dAngStepDeg ;
// inizializzazioni
m_nTotPnt = 0 ;
m_nCurrPnt = - 1 ;
@@ -2056,6 +2052,7 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const
dAngTolDeg = min( dAngTolDeg, ANG_TOL_EXT_MAX_DEG) ;
// determinazione dello step angolare
double dAngStepDeg ;
double dLinTolRel = dLinTol / arArc.GetRadius() ;
if ( bInside)
dAngStepDeg = sqrt( 8 * dLinTolRel) * RADTODEG ;
@@ -2064,7 +2061,7 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const
dAngStepDeg = min( dAngStepDeg, dAngTolDeg) ;
// dall'angolo al centro ricavo il numero di passi
nStep = (int) ( abs( arArc.GetAngCenter()) / dAngStepDeg + 0.999) ;
int nStep = int( abs( arArc.GetAngCenter()) / dAngStepDeg + 0.999) ;
nStep = max( nStep, 1) ;
// sistemo lo step (per il numero intero di passi)
@@ -2091,10 +2088,6 @@ ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const
bool
ArcApproxer::GetPoint( double& dU, Point3d& ptP)
{
Vector3d vtA1p ;
Vector3d vtA2p ;
// incremento indice punto corrente
++ m_nCurrPnt ;
@@ -2125,8 +2118,8 @@ ArcApproxer::GetPoint( double& dU, Point3d& ptP)
else
dU = ( m_nCurrPnt - 0.5) / (double) ( m_nTotPnt - 2) ;
// nuovo valore versori
vtA1p = m_vtA1 ;
vtA2p = m_vtA2 ;
Vector3d vtA1p = m_vtA1 ;
Vector3d vtA2p = m_vtA2 ;
m_vtA1 = m_dCosA * vtA1p + m_dSinA * vtA2p ;
m_vtA2 = - m_dSinA * vtA1p + m_dCosA * vtA2p ;
// calcolo del punto
+5 -2
View File
@@ -515,8 +515,11 @@ PolyLine::IsFlat( int& nRank, Point3d& ptCen, Vector3d& vtDir, double dToler) co
// cerco le componenti principali (tramite PCA)
Point3d ptP1, ptP2 ;
PointsPCA ptsPCA ;
for ( bool bFound = GetFirstLine( ptP1, ptP2) ; bFound ; bFound = GetNextLine( ptP1, ptP2))
ptsPCA.AddPoint( Media( ptP1, ptP2), Dist( ptP1, ptP2)) ;
for ( bool bFound = GetFirstLine( ptP1, ptP2) ; bFound ; bFound = GetNextLine( ptP1, ptP2)) {
double dLen = Dist( ptP1, ptP2) ;
ptsPCA.AddPoint( Media( ptP1, ptP2, 0.25), dLen / 2) ;
ptsPCA.AddPoint( Media( ptP1, ptP2, 0.75), dLen / 2) ;
}
// recupero il rango, ovvero la dimensionalità dell'insieme di punti
nRank = ptsPCA.GetRank() ;
// se dimensione nulla, o non ci sono punti o sono tutti praticamente coincidenti
+3
View File
@@ -45,6 +45,9 @@ Triangulate::Make( const PolyLine& PL, PNTVECTOR& vPt, INTVECTOR& vTr)
// pulisco i vettori di ritorno
vPt.clear() ;
vTr.clear() ;
// verifico che la polilinea contenga almeno 4 punti (primo e ultimo coincidenti)
if ( PL.GetPointNbr() < 4)
return false ;
// verifico che la polilinea sia chiusa e piana e calcolo il piano medio del poligono
double dArea ;
Plane3d plPlane ;