From 4bada73c835f2f410a61885045a459015ac19922 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 23 Feb 2024 10:19:04 +0100 Subject: [PATCH] EgtGeomKernel : - inizio modifica al calcolo di tagli multipli ad una superficie di Bezier. --- SurfBezier.cpp | 216 ++++++++++++++++++++++++++++++++++++++++++------- Tree.cpp | 16 ++-- 2 files changed, 197 insertions(+), 35 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index ee91115..c40e390 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1659,15 +1659,15 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) PNTVECTOR vPnt ; BIPNTVECTOR vBPnt ; TRIA3DVECTOR vTria ; - // con queste righe funzionano anche i tagli multipli//////////////////////////////////////////////// - bool bMod = false ; - // ATTENZIONE!!!!! ad ogni "return false" in questa funzione dovrei reimpostare "m_bTrimmed = true" se bMod == true/////////////////////////////////////////////////// - if ( m_bTrimmed) { - m_bTrimmed = false ; - ResetAuxSurf() ; - bMod = true ; - } - ////i tagli multipli//////////////////////////////////////////////// + //// con queste righe funzionano anche i tagli multipli//////////////////////////////////////////////// + //bool bMod = false ; + //// ATTENZIONE!!!!! ad ogni "return false" in questa funzione dovrei reimpostare "m_bTrimmed = true" se bMod == true/////////////////////////////////////////////////// + //if ( m_bTrimmed) { + // m_bTrimmed = false ; + // ResetAuxSurf() ; + // bMod = true ; + //} + //////i tagli multipli//////////////////////////////////////////////// IntersPlaneSurfTm( plPlane, *GetAuxSurf(), vPnt, vBPnt, vTria) ; // concateno le curve 3d @@ -1791,26 +1791,188 @@ SurfBezier::Cut( const Plane3d& plPlane, bool bSaveOnEq) } // creo il nuovo bordo usando i loop aperti - POLYLINEMATRIX vPolygons ; + //POLYLINEMATRIX vPolygons ; if ( int(vpCCOpen.size()) != 0 ) { - Tree Tree(Point3d( 0, 0, 0), Point3d( m_nSpanU * SBZ_TREG_COEFF, m_nSpanV * SBZ_TREG_COEFF)) ; - POLYLINEVECTOR vPL ; - for ( int i = 0 ; i < int(vpCCOpen.size()); ++i ) { - PolyLine pl ; - vpCCOpen[i]->ApproxWithLines( LIN_TOL_FINE, ANG_TOL_STD_DEG, ICurveComposite::APL_STD, pl) ; - vPL.emplace_back( pl) ; - } - Tree.AddCutsToRoot( vPL) ; - ////debug - //vector vGeoObj ; - //for ( int k = 0 ; k < int( vPL.size()) ; ++ k) { - // PtrOwner pCrv( CreateCurveComposite()) ; - // pCrv->FromPolyLine( vPL[k]) ; - // vGeoObj.emplace_back( static_cast(Release( pCrv))) ; + //Tree Tree(Point3d( 0, 0, 0), Point3d( m_nSpanU * SBZ_TREG_COEFF, m_nSpanV * SBZ_TREG_COEFF)) ; + //POLYLINEVECTOR vPL ; + //for ( int i = 0 ; i < int(vpCCOpen.size()); ++i ) { + // PolyLine pl ; + // vpCCOpen[i]->ApproxWithLines( LIN_TOL_FINE, ANG_TOL_STD_DEG, ICurveComposite::APL_STD, pl) ; + // vPL.emplace_back( pl) ; //} - //SaveGeoObj( vGeoObj, "D:\\Temp\\inters\\sphere_openCuts.nge") ; - ////debug - Tree.CreateCellContour( vPolygons) ; + //Tree.AddCutsToRoot( vPL) ; + + //////debug + ////vector vGeoObj ; + ////for ( int k = 0 ; k < int( vPL.size()) ; ++ k) { + //// PtrOwner pCrv( CreateCurveComposite()) ; + //// pCrv->FromPolyLine( vPL[k]) ; + //// vGeoObj.emplace_back( static_cast(Release( pCrv))) ; + ////} + ////SaveGeoObj( vGeoObj, "D:\\Temp\\inters\\sphere_openCuts.nge") ; + //////debug + + //Tree.CreateCellContour( vPolygons) ; + + + + // qui devo aggiungere tutto del codice nuovo per ricostruire in altro modo il nuovo bordo della superficie + // recupero la regione attuale + PtrOwner pNewTrim( GetTrimRegion()->Clone()) ; + + + // vettore di flag che mi indica quali tagli aperti sono stati aggiunti al nuovo bordo + BOOLVECTOR vbAdded( vpCCOpen.size()) ; + fill(vbAdded.begin(), vbAdded.end(), false) ; + PtrOwner pCCNewEdge( CreateCurveComposite()) ; + PtrOwner pCL( CreateCurveLine()) ; + bool bAddedAll = false ; + int nFirstIntersChunck = -1 ; + int nFirstIntersLoop = -1 ; + double dParamFirstInters = -1 ; + // parto aggiungendo il primo taglio + int nNewToAdd = 0 ; + //while ( ! bAddedAll) { + while ( nNewToAdd != -1) { + // aggiungo il taglio + PtrOwner pLastCC( vpCCOpen[nNewToAdd]->Clone()) ; + pCCNewEdge->AddCurve( Release( vpCCOpen[nNewToAdd])) ; + // aggiorno la lista degli aggiunti + vbAdded[nNewToAdd] = true ; + + + + // ora devo trovare la sua intersezione con un edge + // visto che scorro tutto ogni volta posso almeno evitare il conto se incontro l'edge da cui avevo già trovato lo start + int nChunkE = -1 ; + int nLoopE = -1 ; + int nChunkS = -1 ; + int nLoopS = -1 ; + // scorro tutti i chunk e tutti i loop per trovare l'intersezione + int nInters = 0 ; // per ogni loop devo trovare due intersezioni, una di partenza e una di arrivo + IntCrvCrvInfo iccInfo0 ; + IntCrvCrvInfo iccInfo1 ; + bool bStartInters0 = false ; + for ( int c = 0 ; c < pNewTrim->GetChunkCount() ; ++c) { + for ( int l = 0 ; l < pNewTrim->GetLoopCount( c) ; ++l) { + if ( c == nChunkS && l == nLoopS) + continue ; + PtrOwner pLoop( pNewTrim->GetLoop( c, l)) ; + IntersCurveCurve icc( *pLastCC, *pLoop) ; + if ( icc.GetIntersCount() == 0) + continue ; + if ( icc.GetIntersCount() == 1){ + if ( nInters == 0) { + icc.GetIntCrvCrvInfo( 0, iccInfo0) ; + // do per scontato di avere solo intersezioni all'inizio o alla fine del taglio + if ( iccInfo0.IciA->dU < EPS_SMALL ) { + nChunkS = c ; + nLoopS = l ; + bStartInters0 = true ; + } + else { + nChunkE = c ; + nLoopE = l ; + bStartInters0 = false ; + } + } + else if ( nInters == 1) { + icc.GetIntCrvCrvInfo( 1, iccInfo1) ; + // do per scontato di avere solo intersezioni all'inizio o alla fine del taglio + if ( iccInfo0.IciA->dU < EPS_SMALL ) { + nChunkS = c ; + nLoopS = l ; + } + else { + nChunkE = c ; + nLoopE = l ; + } + } + else + return false ; + ++nInters ; + } + else if (icc.GetIntersCount() == 2) { + icc.GetIntCrvCrvInfo( 0, iccInfo0) ; + // do per scontato di avere solo intersezioni all'inizio o alla fine del taglio + if ( iccInfo0.IciA->dU < EPS_SMALL ) { + nChunkS = c ; + nLoopS = l ; + bStartInters0 = true ; + } + else { + nChunkE = c ; + nLoopE = l ; + bStartInters0 = false ; + } + icc.GetIntCrvCrvInfo( 1, iccInfo1) ; + // do per scontato di avere solo intersezioni all'inizio o alla fine del taglio + if ( iccInfo1.IciA->dU < EPS_SMALL ) { + nChunkS = c ; + nLoopS = l ; + } + else { + nChunkE = c ; + nLoopE = l ; + } + ++nInters ; + ++nInters ; + } + // quando ho trovato due intersezioni esco + if ( nInters == 2) + break ; + } + // quando ho trovato due intersezioni esco + if ( nInters == 2) + break ; + } + // se ho appena aggiunto il primo taglio mi salvo il suo start che mi indicherà dove terminare la ricostruzione del bordo + if ( nNewToAdd == 0 ) { + nFirstIntersChunck = nChunkS ; + nFirstIntersLoop = nLoopS ; + dParamFirstInters = bStartInters0 ? iccInfo0.IciB->dU : iccInfo1.IciB->dU ; + } + // devo trovare fino a che punto seguire il loop che ho trovato come prosecuzione del taglio corrente + // devo quindi trovare la prossima intersezione con un taglio + ICCIVECTOR vICCI ; + PtrOwner pLoop( pNewTrim->GetLoop( nChunkE, nLoopE)) ; + for ( int t = 0 ; t < int( vpCCOpen.size()); ++t) { + IntersCurveCurve icc( *pLoop, *vpCCOpen[t]) ; + if ( icc.GetIntersCount() == 0) + continue ; + else if ( icc.GetIntersCount() == 1) { + vICCI.emplace_back() ; + icc.GetIntCrvCrvInfo( 0, vICCI.back()) ; + } + + + } + + // trimmo il loop che ho trovato come prosecuzione del taglio corrente e la aggiungo al taglio + pLoop->TrimStartAtParam(bStartInters0 ? iccInfo0.IciB->dU : iccInfo1.IciB->dU) ; + pLoop->TrimEndAtParam() ; + // se arrivo fino alla fine del loop devo ricominciare a seguire il loop fino ad un'intersezione? + PtrOwner pLoop2( pNewTrim->GetLoop( nChunkE, nLoopE)) ; + pLoop->TrimEndAtParam() ;// appiccico un pezzo dall'inizio + + + + + // trovo il prossimo taglio ancora da aggiungere + nNewToAdd = -1 ; + for ( int b = 0 ; b < int(vbAdded.size()) ; ++b ) { + if ( ! vbAdded[b]) { + nNewToAdd = b ; + //vbAdded[b] = true ; + break ; + } + } + //// controllo se ho aggiunto tutti i tagli + //bAddedAll = true ; + //for ( int b = 0 ; b < int( vbAdded.size()) ; ++b ) { + // bAddedAll = bAddedAll && vbAdded[b] ; + //} + } } //GESTIONE DEI TRIANGOLI RISULTANTI DALL'INTERSEZIONE diff --git a/Tree.cpp b/Tree.cpp index 5c895b7..d7cdb1a 100644 --- a/Tree.cpp +++ b/Tree.cpp @@ -3685,13 +3685,13 @@ Tree::AddCutsToRoot( POLYLINEVECTOR& vCuts) IntersCurveCurve icc2( *pCL, *pCL2) ; IntersCurveCurve icc3( *pCL, *pCL3) ; IntCrvCrvInfo iccInfo ; - if (icc0.GetCrossIntersCount() != 0) + if (icc0.GetIntersCount() != 0) icc0.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc1.GetCrossIntersCount() != 0) + else if (icc1.GetIntersCount() != 0) icc1.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc2.GetCrossIntersCount() != 0) + else if (icc2.GetIntersCount() != 0) icc2.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc3.GetCrossIntersCount() != 0) + else if (icc3.GetIntersCount() != 0) icc3.GetIntCrvCrvInfo( 0, iccInfo) ; pt = iccInfo.IciA[0].ptI ; if ( ! OnWhichEdge(nRoot, pt, nEdgeIn)) @@ -3718,13 +3718,13 @@ Tree::AddCutsToRoot( POLYLINEVECTOR& vCuts) IntersCurveCurve icc2( *pCL, *pCL2) ; IntersCurveCurve icc3( *pCL, *pCL3) ; IntCrvCrvInfo iccInfo ; - if (icc0.GetCrossIntersCount() != 0) + if (icc0.GetIntersCount() != 0) icc0.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc1.GetCrossIntersCount() != 0) + else if (icc1.GetIntersCount() != 0) icc1.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc2.GetCrossIntersCount() != 0) + else if (icc2.GetIntersCount() != 0) icc2.GetIntCrvCrvInfo( 0, iccInfo) ; - else if (icc3.GetCrossIntersCount() != 0) + else if (icc3.GetIntersCount() != 0) icc3.GetIntCrvCrvInfo( 0, iccInfo) ; pt = iccInfo.IciA[0].ptI ; vInters.pop_back() ;