From ead94e79155897520b62d9fa18e4be6b8e0f2294 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 30 Sep 2025 10:01:01 +0200 Subject: [PATCH] EgtGeomKernel : - VM 5 assi verisione con box object oriented. --- VolZmapVolume.cpp | 97 ++++++++++++++++------------------------------- 1 file changed, 33 insertions(+), 64 deletions(-) diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index ebfb208..f9b86d6 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -19,6 +19,7 @@ #include "CurveBezier.h" #include "VolZmap.h" #include "GeoConst.h" +#include "IntersLineBox.h" #include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgtNumUtils.h" @@ -1323,12 +1324,8 @@ SortGroupInters( PNTVEC3DVECTOR& vInters, INTINTVECTOR& vStartEnds, const Vector //---------------------------------------------------------------------------- struct SurfBezForInters { SurfBezier sBez ; - BBox3d bbSurfZ ; - BBox3d bbSurfX ; - BBox3d bbSurfY ; - Frame3d frZMainDim ; - Frame3d frXMainDim ; - Frame3d frYMainDim ; + BBox3d bbSurfOriented ; + Frame3d frBox ; Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ; } ; @@ -1369,51 +1366,37 @@ Reiterate : continue ; const SurfBezForInters& srf = vSurfBez[s] ; - BBox3d bbox ; + BBox3d bbox = srf.bbSurfOriented; bool bNotValid = false ; Point3d rLoc = r ; + Vector3d qLoc = q ; if ( ! bNeedToRot) { - bbox = srf.bbSurfZ ; - if ( srf.frZMainDim.IsValid()) - rLoc.ToLoc( srf.frZMainDim) ; + rLoc.ToLoc( srf.frBox) ; + qLoc.ToLoc( srf.frBox) ; } - else if ( bNeedToRotX) { - if ( srf.frXMainDim.IsValid()) { - bbox = srf.bbSurfX ; - rLoc.LocToLoc( frRot, srf.frXMainDim) ; - } - else - bNotValid = true ; - } - else if ( bNeedToRotY) { - if ( srf.frYMainDim.IsValid()) { - bbox = srf.bbSurfY ; - rLoc.LocToLoc( frRot, srf.frYMainDim) ; - } - else - bNotValid = true ; + else { + rLoc.LocToLoc( frRot, srf.frBox) ; + qLoc.LocToLoc( frRot, srf.frBox) ; } - if ( bNotValid) { - bbox = srf.bbSurfZ ; - bbox.ToLoc( frRot) ; - } INTDBLVECTOR vIntBoxBox ; bool bCalcInters = false ; int nInterv = -1 ; + // verifico se uno degli intervalli sul voxel interseca il box if ( vInterv.size() > 0 && ! bCalcAll) { - Point3d ptMin = bbox.GetMin(), ptMax = bbox.GetMax() ; for ( int k = 0 ; k < int( vInterv.size()) && ! bCalcInters; ++k) { - bCalcInters = ( vInterv[k].first >= ptMin.z && vInterv[k].first <= ptMax.z) || // minimo compreso nel box - ( vInterv[k].second >= ptMin.z && vInterv[k].second <= ptMax.z) || // massimo compreso nel box - ( vInterv[k].first < ptMin.z && ptMax.z < vInterv[k].second) ; // intervallo comprende il box + INTDBLVECTOR vIntersDash ; + IntersLineBox( rLoc + qLoc * vInterv[k].first, rLoc + qLoc * vInterv[k].second, bbox, vIntersDash, true) ; + bCalcInters = vIntersDash.size() > 0 ; if ( bCalcInters) nInterv = k ; } - bCalcInters = ( bCalcInters && bbox.SqDistFromPointXY( rLoc) < EPS_ZERO) ; } - else - bCalcInters = ( bbox.SqDistFromPointXY( rLoc) < EPS_ZERO) ; + // oppure verifico se il voxel interseca la box + else { + INTDBLVECTOR vIntersDash ; + bCalcInters = IntersLineBox( rLoc, qLoc, 0, bbox, vIntersDash, false) ; + } // verifico che lo spillone faccia interferenza con il box della superficie if ( bCalcInters) { @@ -1996,39 +1979,25 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c vSurfBez[nSurfInd].b1 = -3 * E + 3 * F ; vSurfBez[nSurfInd].b0 = E ; - Vector3d vtDirX ; - Vector3d vtDir0 = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; - Vector3d vtDir1 = vvPtCtrl[z][3] - vvPtCtrl[z][0] ; - if ( vtDir0.Len() > vtDir1.Len()) - vtDirX = vtDir0 ; - else - vtDirX = vtDir1 ; + Vector3d vtDirZ = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; + Vector3d vtDirX = vvPtCtrl[z][3] - vvPtCtrl[z][0] ; + + // devo gestire il caso in cui uno dei due vettori sia == 0 + if (vtDirZ.IsSmall()) { + vtDirZ = vvPtCtrl[z][7] - vvPtCtrl[z][4]; + } + if (vtDirX.IsSmall()) { + vtDirX = vvPtCtrl[z][7] - vvPtCtrl[z][3]; + } + // calcolo il box in un riferimento che usi come asse x la direzione P01 - P00 ( proiettata sul piano perperndicolare a Z) - if ( vSurfBez[nSurfInd].frZMainDim.Set( ORIG, Z_AX, vtDirX)) { + if ( vSurfBez[nSurfInd].frBox.Set( ORIG, vtDirZ, vtDirX)) { // porto tutti i punti in quel riferimento e calcolo il box PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; for ( int p = 0 ; p < int( vPtCtrlLoc.size()) ; ++p) - vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frZMainDim) ; - vSurfBez[nSurfInd].bbSurfZ.Add( vPtCtrlLoc) ; - } - else { - // in ogni caso definisco la box rispetto al rifemento di nGrid - vSurfBez[nSurfInd].bbSurfZ.Add( vvPtCtrl[z]) ; - } - if ( vSurfBez[nSurfInd].frXMainDim.Set( ORIG, X_AX, vtDirX)) { - PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; - // porto tutti i punti in quel riferimento e calcolo il box - for ( int p = 0 ; p < int( vPtCtrlLoc.size()) ; ++p) - vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frXMainDim) ; - vSurfBez[nSurfInd].bbSurfX.Add( vPtCtrlLoc) ; - } - if ( vSurfBez[nSurfInd].frYMainDim.Set( ORIG, Y_AX, vtDirX)) { - PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; - // porto tutti i punti in quel riferimento e calcolo il box - for ( int p = 0 ; p < int( vPtCtrlLoc.size()) ; ++p) - vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frYMainDim) ; - vSurfBez[nSurfInd].bbSurfY.Add( vPtCtrlLoc) ; + vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frBox) ; + vSurfBez[nSurfInd].bbSurfOriented.Add( vPtCtrlLoc) ; } #ifdef TEST