EgtGeomKernel :
- VM 5 assi verisione con box object oriented.
This commit is contained in:
+33
-64
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user