EgtGeomKernel :

- piccole correzioni.
This commit is contained in:
Daniele Bariletti
2025-05-15 16:34:01 +02:00
parent 79dfb4ae87
commit 59755ec8a5
+43 -54
View File
@@ -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<IGeoObj*> 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<PNTVECTOR> 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 ;