From 56b49d4c9ff68579e3a70ce76299501c5a89c4ae Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 1 Dec 2022 11:26:52 +0100 Subject: [PATCH] EgtGeomKernel 2.4k7 : - aggiunta funzione per associare i punti a minima distanza di due polylines - modifiche nelle trimesh rigate per usare nuova funzione polyline. --- EgtGeomKernel.rc | Bin 11726 -> 11726 bytes PolyLine.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++ SurfTriMesh.cpp | 79 ++++++++--------------------------------------- 3 files changed, 92 insertions(+), 66 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index f84e23109c153dab63aadbc40eb151659329f4f6..4fd7082c393ab44837edda23d978a8426201d217 100644 GIT binary patch delta 254 zcmX>XeJ*;#I%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Ux{R&U)L$1;zJ z(R}lLzVl3z6=ZZK-&0g$G@q;}th+ft%8haJByJyOu(U0Zf(m;8g@uDKgeS4!F{eWL r2P3iW+B{pem{Bkv>~K%8!*hTRPTVZ5zL6PIc=Bx3gPUh*n=kXeJ*;#I%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT0Z)! 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 ; +} \ No newline at end of file diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index aa72184..2acf8db 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -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) ;