EgtGeomKernel 2.4k7 :

- aggiunta funzione per associare i punti a minima distanza di due polylines
- modifiche nelle trimesh rigate per usare nuova funzione polyline.
This commit is contained in:
SaraP
2022-12-01 11:26:52 +01:00
parent 7ee0e38cec
commit 56b49d4c9f
3 changed files with 92 additions and 66 deletions
BIN
View File
Binary file not shown.
+79
View File
@@ -1513,3 +1513,82 @@ SplitPolyLineAtPoint( const PolyLine& plPoly, const Point3d& ptP, double dToler,
plPoly2.AddUPoint( 0, ptP, false) ;
return true ;
}
//----------------------------------------------------------------------------
bool
AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIVECTOR& vPnt1, PNTIVECTOR& vPnt2, bool& bCommonInternalPoints)
{
// controllo che le polyline abbiano almeno un punto
int nPnt1 = PL1.GetPointNbr() ;
int nPnt2 = PL2.GetPointNbr() ;
if ( nPnt1 == 0 || nPnt2 == 0)
return false ;
bCommonInternalPoints = false ; // indica la presenza di punti interni in comune tra le due polylines
vPnt1.reserve( PL1.GetPointNbr()) ;
Point3d ptP1 ;
bool bF1 = PL1.GetFirstPoint( ptP1) ;
while ( bF1) {
vPnt1.emplace_back( ptP1, -1) ;
bF1 = PL1.GetNextPoint( ptP1) ;
}
int nTotP1 = int( vPnt1.size()) ;
vPnt2.reserve( PL2.GetPointNbr()) ;
Point3d ptP2 ;
bool bF2 = PL2.GetFirstPoint( ptP2) ;
while ( bF2) {
vPnt2.emplace_back( ptP2, -1) ;
bF2 = PL2.GetNextPoint( ptP2) ;
}
int nTotP2 = int( vPnt2.size()) ;
// calcoli per prima curva
int LastJ = 0 ;
vPnt1[0].second = 0 ;
for ( int i = 1 ; i < nTotP1 ; ++ i) {
double dSqDistMin = SqDist( vPnt1[i].first, vPnt2[LastJ].first) ;
double dApprDistMin = ApproxDist( vPnt1[i].first, vPnt2[LastJ].first) ;
int MinJ = LastJ ;
for ( int j = LastJ + 1 ; j < nTotP2 ; ++ j) {
double dSqDist = SqDist( vPnt1[i].first, vPnt2[j].first) ;
if ( dSqDist < dSqDistMin - 2 * dApprDistMin * EPS_SMALL) {
dSqDistMin = dSqDist ;
dApprDistMin = ApproxDist( vPnt1[i].first, vPnt2[j].first) ;
MinJ = j ;
}
else if ( dSqDist > 16 * dSqDistMin)
break ;
}
if ( i < nTotP1 - 1 && dSqDistMin < EPS_SMALL)
bCommonInternalPoints = true ;
vPnt1[i].second = MinJ ;
LastJ = MinJ ;
}
// calcoli per seconda curva
int LastI = 0 ;
vPnt2[0].second = 0 ;
for ( int j = 1 ; j < nTotP2 ; ++ j) {
double dSqDistMin = SqDist( vPnt2[j].first, vPnt1[LastI].first) ;
double dApprDistMin = ApproxDist( vPnt2[j].first, vPnt1[LastI].first) ;
int MinI = LastI ;
for ( int i = LastI + 1 ; i < nTotP1 ; ++ i) {
double dSqDist = SqDist( vPnt2[j].first, vPnt1[i].first) ;
if ( dSqDist < dSqDistMin - 2 * dApprDistMin * EPS_SMALL) {
dSqDistMin = dSqDist ;
dApprDistMin = ApproxDist( vPnt2[j].first, vPnt1[i].first) ;
MinI = i ;
}
else if ( dSqDist > 16 * dSqDistMin)
break ;
}
if ( j < nTotP2 - 1 && dSqDistMin < EPS_SMALL)
bCommonInternalPoints = true ;
vPnt2[j].second = MinI ;
LastI = MinI ;
}
return true ;
}
+13 -66
View File
@@ -2141,79 +2141,26 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
ResetHashGrids3d() ;
// se rigata a minima distanza tra le due curve
if ( nRuledType == RLT_MINDIST) {
if ( nRuledType == RLT_MINDIST) {
// verifico ci siano almeno due punti diversi per curva
if ( ( PL1.IsClosed() && PL1.GetPointNbr() < 3) || PL1.GetPointNbr() < 2)
return false ;
if ( ( PL2.IsClosed() && PL2.GetPointNbr() < 3) || PL2.GetPointNbr() < 2)
return false ;
return false ;
// flag di curve entrambe chiuse e correzione conseguente a numero totale punti differenti
bool bClosed = PL1.IsClosed() && PL2.IsClosed() ;
// vettori punti con primo punto dell'altra curva a distanza minima
PNTUVECTOR vPnt1 ;
vPnt1.reserve( PL1.GetPointNbr()) ;
Point3d ptP1 ;
bool bF1 = PL1.GetFirstPoint( ptP1) ;
while ( bF1) {
vPnt1.emplace_back( ptP1, -1) ;
bF1 = PL1.GetNextPoint( ptP1) ;
}
int nTotP1 = int( vPnt1.size()) ;
PNTUVECTOR vPnt2 ;
vPnt2.reserve( PL2.GetPointNbr()) ;
Point3d ptP2 ;
bool bF2 = PL2.GetFirstPoint( ptP2) ;
while ( bF2) {
vPnt2.emplace_back( ptP2, -1) ;
bF2 = PL2.GetNextPoint( ptP2) ;
}
// vettori punti con indice del primo punto dell'altra curva a distanza minima
PNTIVECTOR vPnt1, vPnt2 ;
bool bCommonInternalPoints ;
if ( ! AssociatePolyLinesMinDistPoints( PL1, PL2, vPnt1, vPnt2, bCommonInternalPoints))
return false ;
// verifico che non ci siano punti interni in comune
if ( bCommonInternalPoints)
return false ;
int nTotP1 = int( vPnt1.size()) ;
int nTotP2 = int( vPnt2.size()) ;
// calcoli per prima curva
int LastJ = 0 ;
vPnt1[0].second = 0 ;
for ( int i = 1 ; i < nTotP1 ; ++ i) {
double dSqDistMin = SqDist( vPnt1[i].first, vPnt2[LastJ].first) ;
double dApprDistMin = ApproxDist( vPnt1[i].first, vPnt2[LastJ].first) ;
int MinJ = LastJ ;
for ( int j = LastJ + 1 ; j < nTotP2 ; ++ j) {
double dSqDist = SqDist( vPnt1[i].first, vPnt2[j].first) ;
if ( dSqDist < dSqDistMin - 2 * dApprDistMin * EPS_SMALL) {
dSqDistMin = dSqDist ;
dApprDistMin = ApproxDist( vPnt1[i].first, vPnt2[j].first) ;
MinJ = j ;
}
else if ( dSqDist > 16 * dSqDistMin)
break ;
}
if ( i < nTotP1 - 1 && dSqDistMin < EPS_SMALL)
return false ;
vPnt1[i].second = MinJ ;
LastJ = MinJ ;
}
// calcoli per seconda curva
int LastI = 0 ;
vPnt2[0].second = 0 ;
for ( int j = 1 ; j < nTotP2 ; ++ j) {
double dSqDistMin = SqDist( vPnt2[j].first, vPnt1[LastI].first) ;
double dApprDistMin = ApproxDist( vPnt2[j].first, vPnt1[LastI].first) ;
int MinI = LastI ;
for ( int i = LastI + 1 ; i < nTotP1 ; ++ i) {
double dSqDist = SqDist( vPnt2[j].first, vPnt1[i].first) ;
if ( dSqDist < dSqDistMin - 2 * dApprDistMin * EPS_SMALL) {
dSqDistMin = dSqDist ;
dApprDistMin = ApproxDist( vPnt2[j].first, vPnt1[i].first) ;
MinI = i ;
}
else if ( dSqDist > 16 * dSqDistMin)
break ;
}
if ( j < nTotP2 - 1 && dSqDistMin < EPS_SMALL)
return false ;
vPnt2[j].second = MinI ;
LastI = MinI ;
}
// Costruisco la mesh
int nVertNbr = nTotP1 + nTotP2 ;
@@ -2317,7 +2264,7 @@ SurfTriMesh::CreateByTwoCurves( const PolyLine& PL1, const PolyLine& PL2, int nR
if ( ! VerifyPolylinesForTwoCurves( PL1, PL2))
return false ;
// flag di curve chiuse
// flag di curve chiuse
bool bClosed = PL1.IsClosed() && PL2.IsClosed() ;
// recupero i parametri delle due polilinee
double dU1F ; PL1.GetFirstU( dU1F) ;