EgtGeomKernel :
- piccole correzioni.
This commit is contained in:
+43
-54
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user