EgtGeomKernel :

- VM 5 assi verisione con box object oriented.
This commit is contained in:
Daniele Bariletti
2025-09-30 10:01:01 +02:00
parent dfc3c29439
commit ead94e7915
+33 -64
View File
@@ -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