From 59755ec8a52d7af20bc8616b250dab7fe9bc86a8 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 15 May 2025 16:34:01 +0200 Subject: [PATCH] EgtGeomKernel : - piccole correzioni. --- VolZmapVolume.cpp | 97 +++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 4cc2ed8..922332f 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -958,7 +958,7 @@ VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Ve // qui al momento gestisco solo il caso del cilindro, ma dovrò gestire anche gli altri casi /////////////////////////////////////////////////////////////////////////////////////////// - // tolgo il volume dei cilindri all'inzio e alla fine del tratto e poi uso delle bilineari per approssimare il volume spazzato + // tolgo il volume dei cilindri all'inizio e alla fine del tratto e poi uso delle bilineari per approssimare il volume spazzato Point3d ptLs[N_MAPS] ; Point3d ptLe[N_MAPS] ; Vector3d vtLs[N_MAPS] ; @@ -1013,7 +1013,6 @@ VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Ve InitializeAuxPoints( ptTop1s, ptTop1e, ptTop2s, ptTop2e, ptBottom1s, ptBottom1e, ptBottom2s, ptBottom2e) ; - vector vGeo ; for ( int z = 0 ; z < m_nMapNum ; ++z) { //CompCyl_AcrossMilling() // questa potrebbe essere la funzione che raccoglie tutto quello che ci sarà in questo for @@ -1044,39 +1043,34 @@ VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Ve bool bRat = false ; vector vvPtCtrl ; PNTVECTOR vPtCtrl0 = { ptBottom1s[z], ptTop1s[z], ptBottom1e[z], ptTop1e[z]} ; - vvPtCtrl.push_back( move( vPtCtrl0)) ; + vvPtCtrl.push_back( std::move( vPtCtrl0)) ; PNTVECTOR vPtCtrl1 = { ptBottom2s[z], ptBottom1s[z], ptBottom2e[z], ptBottom1e[z]} ; - vvPtCtrl.push_back( move( vPtCtrl1)) ; + vvPtCtrl.push_back( std::move( vPtCtrl1)) ; PNTVECTOR vPtCtrl2 = { ptTop2s[z], ptBottom2s[z], ptTop2e[z], ptBottom2e[z]} ; - vvPtCtrl.push_back( move( vPtCtrl2)) ; + vvPtCtrl.push_back( std::move( vPtCtrl2)) ; PNTVECTOR vPtCtrl3 = { ptTop1s[z], ptTop2s[z], ptTop1e[z], ptTop2e[z]} ; - vvPtCtrl.push_back( move( vPtCtrl3)) ; + vvPtCtrl.push_back( std::move( vPtCtrl3)) ; PNTVECTOR vPtCtrl4 = { ptBottom1s[z], ptBottom2s[z], ptTop1s[z], ptTop2s[z]} ; - vvPtCtrl.push_back( move( vPtCtrl4)) ; + vvPtCtrl.push_back( std::move( vPtCtrl4)) ; PNTVECTOR vPtCtrl5 = { ptBottom2e[z], ptBottom1e[z], ptTop2e[z], ptTop1e[z]} ; - vvPtCtrl.push_back( move( vPtCtrl5)) ; + vvPtCtrl.push_back( std::move( vPtCtrl5)) ; - // per ognuna delle 6 superfici bilineari + BOXVECTOR vSurfBox(6) ; + + // inizializzo le 6 superfici bilineari e i parametri per le intersezioni ISURFBEZPOVECTOR vSurfBez ; - //VCT3DVECTOR a ; - //VCT3DVECTOR b ; - //VCT3DVECTOR c ; PNTVECTOR d ; Vector3d q = Z_AX ; DBLVECTOR A1, B1, C1, A2, B2, C2 ; for( int s = 0 ; s < 6 ; ++s) { - // inzializzo la superficie vSurfBez.emplace_back( CreateSurfBezier()) ; vSurfBez.back()->Init(nDegU, nDegV, nSpanU, nSpanV, bRat) ; vSurfBez.back()->SetControlPoint( 0, vvPtCtrl[s][0]) ; vSurfBez.back()->SetControlPoint( 1, vvPtCtrl[s][1]) ; vSurfBez.back()->SetControlPoint( 2, vvPtCtrl[s][2]) ; vSurfBez.back()->SetControlPoint( 3, vvPtCtrl[s][3]) ; + vSurfBox[s].Add( vvPtCtrl[s]) ; - // salvo i parametri per il calcolo delle intersezioni - //a.push_back( vvPtCtrl[s][3] - vvPtCtrl[s][1] + ( vvPtCtrl[s][0] - vvPtCtrl[s][2])) ; - //b.push_back( vvPtCtrl[s][1] - vvPtCtrl[s][0]) ; - //c.push_back( vvPtCtrl[s][2] - vvPtCtrl[s][0]) ; Vector3d a = vvPtCtrl[s][3] - vvPtCtrl[s][1] + ( vvPtCtrl[s][0] - vvPtCtrl[s][2]) ; Vector3d b = vvPtCtrl[s][1] - vvPtCtrl[s][0] ; Vector3d c = vvPtCtrl[s][2] - vvPtCtrl[s][0] ; @@ -1090,7 +1084,6 @@ VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Ve C2.push_back( c.y * q.z - c.z * q.y) ; } - // scorro tutti gli spilloni interessati for ( int i = nStartI ; i <= nEndI ; ++ i) { for ( int j = nStartJ ; j <= nEndJ ; ++ j) { @@ -1101,40 +1094,36 @@ VolZmap::SelectGeneralMotion( const Point3d& ptPs, const Point3d& ptPe, const Ve double dMin = INFINITO, dMax = -10 ; Vector3d vtMin, vtMax ; for( int s = 0 ; s < 6 ; ++s) { - // di queste variabili probabilmente posso portare fuori dai for nested tutte quelle che non dipendono da r ed esplicitare già qx = 0, qy= 0 , qz = 1 - //double A1 = a[s].x * q.z - a[s].z * q.x ; - //double B1 = b[s].x * q.z - b[s].z * q.x ; - //double C1 = c[s].x * q.z - c[s].z * q.x ; - double D1 = ( d[s].x - r.x) * q.z - ( d[s].z - r.z) * q.x ; - //double A2 = a[s].y * q.z - a[s].z * q.y ; - //double B2 = b[s].y * q.z - b[s].z * q.y ; - //double C2 = c[s].y * q.z - c[s].z * q.y ; - double D2 = ( d[s].y - r.y) * q.z - ( d[s].z - r.z) * q.y ; + // verifico che lo spillone faccia interferenza con il box della superficie + if ( vSurfBox[s].SqDistFromPointXY( r) < EPS_ZERO) { + double D1 = ( d[s].x - r.x) * q.z - ( d[s].z - r.z) * q.x ; + double D2 = ( d[s].y - r.y) * q.z - ( d[s].z - r.z) * q.y ; - DBLVECTOR vdCoeff, vdRoots ; - vdCoeff = { (B2[s] * D1 - B1[s] * D2), ( A2[s] * D1 - A1[s] * D2 + B2[s] * C1[s] - B1[s] * C2[s]), ( A2[s] * C1[s] - A1[s] * C2[s])} ; - int nRoots = PolynomialRoots( 2, vdCoeff, vdRoots) ; - if ( nRoots != 0) { - double dU1 = 0, dV1 = 0 ; - double dU2 = 0, dV2 = 0 ; - if ( vdRoots[0] > 0 - EPS_ZERO && vdRoots[0] < 1 + EPS_ZERO) { - dV1 = vdRoots[0] ; - dU1 = (dV1 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV1 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ; - if ( dU1 > - EPS_ZERO && dU1 < 1 + EPS_ZERO) { - Point3d ptBez1 ; - Vector3d vtN1 ; - vSurfBez[s]->GetPointNrmD1D2(dU1, dV1, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez1, vtN1) ; - UpdateMaxMin( ptBez1, vtN1, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ; + DBLVECTOR vdCoeff, vdRoots ; + vdCoeff = { (B2[s] * D1 - B1[s] * D2), ( A2[s] * D1 - A1[s] * D2 + B2[s] * C1[s] - B1[s] * C2[s]), ( A2[s] * C1[s] - A1[s] * C2[s])} ; + int nRoots = PolynomialRoots( 2, vdCoeff, vdRoots) ; + if ( nRoots != 0) { + double dU1 = 0, dV1 = 0 ; + double dU2 = 0, dV2 = 0 ; + if ( vdRoots[0] > 0 - EPS_ZERO && vdRoots[0] < 1 + EPS_ZERO) { + dV1 = vdRoots[0] ; + dU1 = (dV1 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV1 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ; + if ( dU1 > - EPS_ZERO && dU1 < 1 + EPS_ZERO) { + Point3d ptBez1 ; + Vector3d vtN1 ; + vSurfBez[s]->GetPointNrmD1D2(dU1, dV1, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez1, vtN1) ; + UpdateMaxMin( ptBez1, vtN1, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ; + } } - } - if ( nRoots > 1 && vdRoots[1] > 0 - EPS_ZERO && vdRoots[1] < 1 + EPS_ZERO) { - dV2 = vdRoots[1] ; - dU2 = (dV2 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV2 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ; - if ( dU2 > - EPS_ZERO && dU2 < 1 + EPS_ZERO) { - Point3d ptBez2 ; - Vector3d vtN2 ; - vSurfBez[s]->GetPointNrmD1D2(dU2, dV2, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez2, vtN2) ; - UpdateMaxMin( ptBez2, vtN2, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ; + if ( nRoots > 1 && vdRoots[1] > 0 - EPS_ZERO && vdRoots[1] < 1 + EPS_ZERO) { + dV2 = vdRoots[1] ; + dU2 = (dV2 * (C1[s] - C2[s]) + ( D1 - D2)) / ( dV2 * ( A2[s] - A1[s]) + ( B2[s] - B1[s])) ; + if ( dU2 > - EPS_ZERO && dU2 < 1 + EPS_ZERO) { + Point3d ptBez2 ; + Vector3d vtN2 ; + vSurfBez[s]->GetPointNrmD1D2(dU2, dV2, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez2, vtN2) ; + UpdateMaxMin( ptBez2, vtN2, dMin, dMax, ptMin, ptMax, vtMin, vtMax) ; + } } } } @@ -1163,7 +1152,7 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co bool bOk = true ; // valori allo step i-esimo - Point3d ptSt = ptPs ; ///////////////////// commentato per debug + //Point3d ptSt = ptPs ; ///////////////////// commentato per debug Point3d ptSti = ptPs ; @@ -1196,11 +1185,11 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co dDirCoeffS = double( i) / (nStepCnt + 1) ; dPosCoeffE = double( i + 1) / (nStepCnt + 1) ; dDirCoeffE = double( i + 1) / (nStepCnt + 1) ; - if ( i != 0) + if ( i != 0) { ptSti = Media( ptPs, ptPe, dPosCoeffS - dCorr) ; - Point3d ptEni = Media( ptPs, ptPe, i != nStepCnt ? dPosCoeffE : (dPosCoeffE + dCorr)) ; - if ( i != 0) vtDSi = Media( vtDs, vtDe, dDirCoeffS - dCorr) ; vtDSi.Normalize() ; + } + Point3d ptEni = Media( ptPs, ptPe, i != nStepCnt ? dPosCoeffE : (dPosCoeffE + dCorr)) ; Vector3d vtDEi = Media( vtDs, vtDe, i != nStepCnt ? dDirCoeffE : (dPosCoeffE + dCorr)) ; vtDEi.Normalize() ; int nPhase = VolZmap::MillingPhase::ONLY_LATERAL_SURF ;