EgtGeomKernel :
- VM 5 assi con bilineari con un volume unico.
This commit is contained in:
+277
-247
@@ -1553,21 +1553,21 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTopStartFront[i], vPntTopStartFront[i+1], vPntTopEndFront[i], vPntTopEndFront[i+1]})) ;
|
||||
}
|
||||
// chiudo il volume con le superici verticali all'ultimo step
|
||||
if( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && s == nStepCnt - 1) {
|
||||
if ( dSide > 0) {
|
||||
for ( int i = 0 ; i < nSub ; ++i )
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExF[i+1], vPntTipStartExF[i], vPntTopStartExB[nSub - i - 1], vPntTopStartExB[nSub - i]})) ;
|
||||
for ( int i = 0 ; i < nSub ; ++i )
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExF[i], vPntTipEndExF[i+1], vPntTopEndExB[nSub - i], vPntTopEndExB[nSub - i- 1]})) ;
|
||||
}
|
||||
else {
|
||||
for ( int i = 0 ; i < nSub ; ++i )
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExB[i+1], vPntTipStartExB[i], vPntTopStartExF[nSub - i - 1], vPntTopStartExF[nSub - i]})) ;
|
||||
for ( int i = 0 ; i < nSub ; ++i )
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExB[i+1], vPntTipEndExB[i], vPntTopEndExF[nSub - i], vPntTopEndExF[nSub - i- 1]})) ;
|
||||
}
|
||||
}
|
||||
//// chiudo il volume con le superici verticali all'ultimo step
|
||||
//if( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && s == nStepCnt - 1) {
|
||||
// if ( dSide > 0) {
|
||||
// for ( int i = 0 ; i < nSub ; ++i )
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExF[i+1], vPntTipStartExF[i], vPntTopStartExB[nSub - i - 1], vPntTopStartExB[nSub - i]})) ;
|
||||
// for ( int i = 0 ; i < nSub ; ++i )
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExF[i], vPntTipEndExF[i+1], vPntTopEndExB[nSub - i], vPntTopEndExB[nSub - i- 1]})) ;
|
||||
// }
|
||||
// else {
|
||||
// for ( int i = 0 ; i < nSub ; ++i )
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExB[i+1], vPntTipStartExB[i], vPntTopStartExF[nSub - i - 1], vPntTopStartExF[nSub - i]})) ;
|
||||
// for ( int i = 0 ; i < nSub ; ++i )
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExB[i+1], vPntTipEndExB[i], vPntTopEndExF[nSub - i], vPntTopEndExF[nSub - i- 1]})) ;
|
||||
// }
|
||||
//}
|
||||
// aggiungo le superfici bilineari anche nell'altro verso sia per il top che per il tip
|
||||
if( n5AxisType == VolZmap::Move5Axis::ACROSS) {
|
||||
if ( dSide > 0 ) {
|
||||
@@ -1586,21 +1586,21 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTopStartBack[i+1], vPntTopStartBack[i], vPntTopEndBack[i+1], vPntTopEndBack[i]})) ;
|
||||
}
|
||||
// all'ultimo step chiudo i volumi delimitati dalle bilineari
|
||||
if( s == nStepCnt - 1) {
|
||||
// chiudo il volume con le superici verticali, 1o volume, interne
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExF[i+1], vPntTipStartExF[i], vPntTopStartExF[i+1], vPntTopStartExF[i]})) ;
|
||||
// chiudo il volume con le superici verticali, 2o volume, interne
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExB[i+1], vPntTipEndExB[i], vPntTopEndExB[i+1], vPntTopEndExB[i]})) ;
|
||||
// chiudo il volume con le superici verticali, 1o volume, esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExF[i], vPntTipEndExF[i+1], vPntTopEndExF[i], vPntTopEndExF[i+1]})) ;
|
||||
// chiudo il volume con le superici verticali, 2o volume, esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i)
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExB[i], vPntTipStartExB[i+1], vPntTopStartExB[i], vPntTopStartExB[i+1]})) ;
|
||||
}
|
||||
//// all'ultimo step chiudo i volumi delimitati dalle bilineari
|
||||
//if( s == nStepCnt - 1) {
|
||||
// // chiudo il volume con le superici verticali, 1o volume, interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i)
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExF[i+1], vPntTipStartExF[i], vPntTopStartExF[i+1], vPntTopStartExF[i]})) ;
|
||||
// // chiudo il volume con le superici verticali, 2o volume, interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i)
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExB[i+1], vPntTipEndExB[i], vPntTopEndExB[i+1], vPntTopEndExB[i]})) ;
|
||||
// // chiudo il volume con le superici verticali, 1o volume, esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i)
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipEndExF[i], vPntTipEndExF[i+1], vPntTopEndExF[i], vPntTopEndExF[i+1]})) ;
|
||||
// // chiudo il volume con le superici verticali, 2o volume, esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i)
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartExB[i], vPntTipStartExB[i+1], vPntTopStartExB[i], vPntTopStartExB[i+1]})) ;
|
||||
//}
|
||||
}
|
||||
}
|
||||
else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) {
|
||||
@@ -1613,27 +1613,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
// superfici inferiori semplici
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTipStartFront.front(), vPntTipStartFront.back(), vPntTipEndFront.front(), vPntTipEndFront.back()})) ;
|
||||
|
||||
if( s == nStepCnt - 1) {
|
||||
// calcolo i punti di split dei diametri
|
||||
PNTVECTOR vSplitDiamStart ;
|
||||
PNTVECTOR vSplitDiamEnd ;
|
||||
Vector3d vDirDiamStart = (vPntTipStartExF.back() - vPntTipStartExF.front()) / nSub ;
|
||||
Vector3d vDirDiamEnd = (vPntTipEndExF.back() - vPntTipEndExF.front()) / nSub ;
|
||||
for ( int i = 0 ; i <= nSub ; ++i) {
|
||||
vSplitDiamStart.push_back( vPntTipStartExF.front() + i * vDirDiamStart) ;
|
||||
vSplitDiamEnd.push_back( vPntTipEndExF.front() + i * vDirDiamEnd) ;
|
||||
}
|
||||
// aggiungo le superfici verticali esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i) {
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i+1], vSplitDiamStart[i], vPntTopStartExB[nSub - i - 1], vPntTopStartExB[nSub - i]})) ;
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i], vSplitDiamEnd[i+1], vPntTopEndExF[i], vPntTopEndExF[i+1]})) ;
|
||||
}
|
||||
// aggiungo le superfici verticali interne
|
||||
for ( int i = 0 ; i < nSub ; ++i) {
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i+1], vSplitDiamStart[i], vPntTopStartExF[i+1], vPntTopStartExF[i]})) ;
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i], vSplitDiamEnd[i+1], vPntTopEndExB[nSub - i], vPntTopEndExB[nSub - i - 1]})) ;
|
||||
}
|
||||
}
|
||||
//if( s == nStepCnt - 1) {
|
||||
// // calcolo i punti di split dei diametri
|
||||
// PNTVECTOR vSplitDiamStart ;
|
||||
// PNTVECTOR vSplitDiamEnd ;
|
||||
// Vector3d vDirDiamStart = (vPntTipStartExF.back() - vPntTipStartExF.front()) / nSub ;
|
||||
// Vector3d vDirDiamEnd = (vPntTipEndExF.back() - vPntTipEndExF.front()) / nSub ;
|
||||
// for ( int i = 0 ; i <= nSub ; ++i) {
|
||||
// vSplitDiamStart.push_back( vPntTipStartExF.front() + i * vDirDiamStart) ;
|
||||
// vSplitDiamEnd.push_back( vPntTipEndExF.front() + i * vDirDiamEnd) ;
|
||||
// }
|
||||
// // aggiungo le superfici verticali esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i) {
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i+1], vSplitDiamStart[i], vPntTopStartExB[nSub - i - 1], vPntTopStartExB[nSub - i]})) ;
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i], vSplitDiamEnd[i+1], vPntTopEndExF[i], vPntTopEndExF[i+1]})) ;
|
||||
// }
|
||||
// // aggiungo le superfici verticali interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i) {
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i+1], vSplitDiamStart[i], vPntTopStartExF[i+1], vPntTopStartExF[i]})) ;
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i], vSplitDiamEnd[i+1], vPntTopEndExB[nSub - i], vPntTopEndExB[nSub - i - 1]})) ;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) {
|
||||
// superfici inferiori
|
||||
@@ -1645,27 +1645,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
// superfici superiori semplici
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vPntTopStartFront.back(), vPntTopStartFront.front(), vPntTopEndFront.back(), vPntTopEndFront.front()})) ;
|
||||
|
||||
if( s == nStepCnt - 1) {
|
||||
// calcolo i punti di split dei diametri
|
||||
PNTVECTOR vSplitDiamStart ;
|
||||
PNTVECTOR vSplitDiamEnd ;
|
||||
Vector3d vDirDiamStart = (vPntTopStartExF.back() - vPntTopStartExF.front()) / nSub ;
|
||||
Vector3d vDirDiamEnd = (vPntTopEndExF.back() - vPntTopEndExF.front()) / nSub ;
|
||||
for ( int i = 0 ; i <= nSub ; ++i) {
|
||||
vSplitDiamStart.push_back( vPntTopStartExF.front() + i * vDirDiamStart) ;
|
||||
vSplitDiamEnd.push_back( vPntTopEndExF.front() + i * vDirDiamEnd) ;
|
||||
}
|
||||
// aggiungo le superfici verticali esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i) {
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i], vSplitDiamStart[i+1], vPntTipStartExB[nSub - i], vPntTipStartExB[nSub - i - 1]})) ;
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i+1], vSplitDiamEnd[i], vPntTipEndExF[i+1], vPntTipEndExF[i]})) ;
|
||||
}
|
||||
// aggiungo le superfici verticali interne
|
||||
for ( int i = 0 ; i < nSub ; ++i) {
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i], vSplitDiamStart[i+1], vPntTipStartExF[i], vPntTipStartExF[i+1]})) ;
|
||||
vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i+1], vSplitDiamEnd[i], vPntTipEndExB[nSub - i - 1], vPntTipEndExB[nSub - i]})) ;
|
||||
}
|
||||
}
|
||||
//if( s == nStepCnt - 1) {
|
||||
// // calcolo i punti di split dei diametri
|
||||
// PNTVECTOR vSplitDiamStart ;
|
||||
// PNTVECTOR vSplitDiamEnd ;
|
||||
// Vector3d vDirDiamStart = (vPntTopStartExF.back() - vPntTopStartExF.front()) / nSub ;
|
||||
// Vector3d vDirDiamEnd = (vPntTopEndExF.back() - vPntTopEndExF.front()) / nSub ;
|
||||
// for ( int i = 0 ; i <= nSub ; ++i) {
|
||||
// vSplitDiamStart.push_back( vPntTopStartExF.front() + i * vDirDiamStart) ;
|
||||
// vSplitDiamEnd.push_back( vPntTopEndExF.front() + i * vDirDiamEnd) ;
|
||||
// }
|
||||
// // aggiungo le superfici verticali esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i) {
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i], vSplitDiamStart[i+1], vPntTipStartExB[nSub - i], vPntTipStartExB[nSub - i - 1]})) ;
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i+1], vSplitDiamEnd[i], vPntTipEndExF[i+1], vPntTipEndExF[i]})) ;
|
||||
// }
|
||||
// // aggiungo le superfici verticali interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i) {
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamStart[i], vSplitDiamStart[i+1], vPntTipStartExF[i], vPntTipStartExF[i+1]})) ;
|
||||
// vvPtCtrl.emplace_back( PNTVECTOR({ vSplitDiamEnd[i+1], vSplitDiamEnd[i], vPntTipEndExB[nSub - i - 1], vPntTipEndExB[nSub - i]})) ;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1764,145 +1764,143 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
|
||||
// scorro tutti gli spilloni interessati
|
||||
int nAllStepsSurfs = nTotSurf * nStepCnt ;
|
||||
vector<INTVECTOR> vvnSurf ;
|
||||
if( n5AxisType != VolZmap::Move5Axis::ACROSS) {
|
||||
vvnSurf.emplace_back() ;
|
||||
vvnSurf[0].resize( nAllStepsSurfs) ;
|
||||
iota( vvnSurf[0].begin(), vvnSurf[0].end(), 0) ;
|
||||
}
|
||||
else {
|
||||
vvnSurf.resize( 2) ;
|
||||
// superfici laterali
|
||||
int nSurf = 0 ;
|
||||
for( int s = 0 ; s < nStepCnt ; ++s) {
|
||||
//superifici laterali
|
||||
for ( int i = 0 ; i < 2 ; ++i, ++nSurf) {
|
||||
vvnSurf[0].push_back( nSurf) ;
|
||||
vvnSurf[1].push_back( nSurf) ;
|
||||
}
|
||||
// superfici inferiori in avanti
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[0].push_back( nSurf) ;
|
||||
//superfici superiori indietro
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[1].push_back( nSurf) ;
|
||||
//superfici inferiori indietro
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[1].push_back( nSurf) ;
|
||||
//superfici superiori in avanti
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[0].push_back( nSurf) ;
|
||||
}
|
||||
// superfici verticali in avanti interne
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf )
|
||||
vvnSurf[0].push_back( nSurf) ;
|
||||
// superfici verticali indietro interne
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[1].push_back( nSurf) ;
|
||||
// superfici verticali in avanti esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf )
|
||||
vvnSurf[0].push_back( nSurf) ;
|
||||
// superfici verticali indietro esterne
|
||||
for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
vvnSurf[1].push_back( nSurf) ;
|
||||
//vector<INTVECTOR> vvnSurf ;
|
||||
//if( n5AxisType != VolZmap::Move5Axis::ACROSS) {
|
||||
// vvnSurf.emplace_back() ;
|
||||
// vvnSurf[0].resize( nAllStepsSurfs) ;
|
||||
// iota( vvnSurf[0].begin(), vvnSurf[0].end(), 0) ;
|
||||
//}
|
||||
//else {
|
||||
// vvnSurf.resize( 2) ;
|
||||
// // superfici laterali
|
||||
// int nSurf = 0 ;
|
||||
// for( int s = 0 ; s < nStepCnt ; ++s) {
|
||||
// //superifici laterali
|
||||
// for ( int i = 0 ; i < 2 ; ++i, ++nSurf) {
|
||||
// vvnSurf[0].push_back( nSurf) ;
|
||||
// vvnSurf[1].push_back( nSurf) ;
|
||||
// }
|
||||
// // superfici inferiori in avanti
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[0].push_back( nSurf) ;
|
||||
// //superfici superiori indietro
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[1].push_back( nSurf) ;
|
||||
// //superfici inferiori indietro
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[1].push_back( nSurf) ;
|
||||
// //superfici superiori in avanti
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[0].push_back( nSurf) ;
|
||||
// }
|
||||
// // superfici verticali in avanti interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf )
|
||||
// vvnSurf[0].push_back( nSurf) ;
|
||||
// // superfici verticali indietro interne
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[1].push_back( nSurf) ;
|
||||
// // superfici verticali in avanti esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf )
|
||||
// vvnSurf[0].push_back( nSurf) ;
|
||||
// // superfici verticali indietro esterne
|
||||
// for ( int i = 0 ; i < nSub ; ++i, ++nSurf)
|
||||
// vvnSurf[1].push_back( nSurf) ;
|
||||
|
||||
// N.B. : avanti e indietro sono riferiti al caso dSide >0 , in caso dSide <0 si invertono
|
||||
// ai fini della divisione in due volumi diversi non importa chi sia il primo e chi il secondo volume
|
||||
}
|
||||
// // N.B. : avanti e indietro sono riferiti al caso dSide >0 , in caso dSide <0 si invertono
|
||||
// // ai fini della divisione in due volumi diversi non importa chi sia il primo e chi il secondo volume
|
||||
//}
|
||||
for ( int i = nStartI ; i <= nEndI ; ++ i) {
|
||||
for ( int j = nStartJ ; j <= nEndJ ; ++ j) {
|
||||
double dX = ( i + 0.5) * m_dStep ;
|
||||
double dY = ( j + 0.5) * m_dStep ;
|
||||
Point3d r( dX, dY, 0) ;
|
||||
vector<PNTVEC3DVECTOR> vvInters( vvnSurf.size()) ;
|
||||
vector<INTINTVECTOR> vvStartEnds( vvnSurf.size()) ;
|
||||
PNTVEC3DVECTOR vInters ;
|
||||
INTINTVECTOR vvStartEnds ;
|
||||
//debug
|
||||
INTVECTOR vSurfInters ;
|
||||
for(int v = 0 ; v < int(vvnSurf.size()) ; ++v) {
|
||||
// interseco con le bilineari
|
||||
for( int s : vvnSurf[v]) {
|
||||
// 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 ;
|
||||
// interseco con le bilineari
|
||||
for( int s = 0 ; s < int( vSurfBez.size()) ; ++s) {
|
||||
// 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) ;
|
||||
vtN1 *= -1 ;
|
||||
UpdateMaxMin( ptBez1, vtN1, vvInters[v]) ;
|
||||
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) ;
|
||||
vtN1 *= -1 ;
|
||||
UpdateMaxMin( ptBez1, vtN1, vInters) ;
|
||||
|
||||
//debug
|
||||
vSurfInters.push_back( s) ;
|
||||
}
|
||||
//debug
|
||||
vSurfInters.push_back( s) ;
|
||||
}
|
||||
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) ;
|
||||
vtN2 *= -1 ;
|
||||
UpdateMaxMin( ptBez2, vtN2, vvInters[v]) ;
|
||||
}
|
||||
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) ;
|
||||
vtN2 *= -1 ;
|
||||
UpdateMaxMin( ptBez2, vtN2, vInters) ;
|
||||
|
||||
//debug
|
||||
vSurfInters.push_back( s) ;
|
||||
}
|
||||
//debug
|
||||
vSurfInters.push_back( s) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( vvInters[v].size() > 2 ) {
|
||||
sort( vvInters[v].begin(), vvInters[v].end(), [](PNTVEC3D& a, PNTVEC3D& b) { return a.first.z < b.first.z ; }) ;
|
||||
INTINT pStartEnd ;
|
||||
bool bDirStart = vvInters[v].front().second * Z_AX > 0 ;
|
||||
bool bFirstEndFound = false ;
|
||||
pStartEnd.first = 0 ;
|
||||
for ( int w = 1 ; w < int( vvInters[v].size()) ; ++w) {
|
||||
bool bDir = vvInters[v][w].second * Z_AX > 0 ;
|
||||
// se è l'ultimo punto esco
|
||||
if ( w == int( vvInters[v].size() - 1) && bDirStart != bDir) {
|
||||
pStartEnd.second = w ;
|
||||
vvStartEnds[v].push_back(pStartEnd) ;
|
||||
break ;
|
||||
}
|
||||
// sennò scorro finché non trovo l'uscita più lontana ( prima di un altro ingresso o eventualmente l'ultima inters)
|
||||
else if( bDirStart != bDir)
|
||||
bFirstEndFound = true ;
|
||||
// se trovo di nuovo un'intersezione orientata come la prima dello spillone allora ho un nuovo start e posso chiudere l'intervallo precedente
|
||||
else if( bFirstEndFound && bDirStart == bDir) {
|
||||
pStartEnd.second = w - 1 ;
|
||||
bFirstEndFound = false ;
|
||||
vvStartEnds[v].push_back(pStartEnd) ;
|
||||
pStartEnd.first = w ;
|
||||
pStartEnd.second = -1 ;
|
||||
}
|
||||
}
|
||||
for( auto p : vvStartEnds[v] )
|
||||
SubtractIntervals(nGrid, i, j, vvInters[v][p.first].first.z, vvInters[v][p.second].first.z, vvInters[v][p.first].second, vvInters[v][p.second].second, nToolNum) ;
|
||||
}
|
||||
else if ( vvInters[v].size() == 2){
|
||||
vvStartEnds[v].push_back(INTINT(0, 1)) ;
|
||||
SubtractIntervals( nGrid, i, j, vvInters[v].front().first.z, vvInters[v].back().first.z, vvInters[v].front().second, vvInters[v].back().second, nToolNum) ;
|
||||
}
|
||||
else if ( vvInters[v].size() == 1)
|
||||
return false ;
|
||||
}
|
||||
|
||||
//if ( vInters.size() > 2) {
|
||||
// sort( vInters.begin(), vInters.end(), [](PNTVEC3D& a, PNTVEC3D& b) { return a.first.z < b.first.z ; }) ;
|
||||
// INTINT pStartEnd ;
|
||||
// bool bDirStart = vInters.front().second * Z_AX > 0 ;
|
||||
// bool bFirstEndFound = false ;
|
||||
// pStartEnd.first = 0 ;
|
||||
// for ( int w = 1 ; w < int( vInters.size()) ; ++w) {
|
||||
// bool bDir = vInters[w].second * Z_AX > 0 ;
|
||||
// // se è l'ultimo punto esco
|
||||
// if ( w == int( vInters.size() - 1) && bDirStart != bDir) {
|
||||
// pStartEnd.second = w ;
|
||||
// vvStartEnds.push_back(pStartEnd) ;
|
||||
// break ;
|
||||
// }
|
||||
// // sennò scorro finché non trovo l'uscita più lontana ( prima di un altro ingresso o eventualmente l'ultima inters)
|
||||
// else if( bDirStart != bDir)
|
||||
// bFirstEndFound = true ;
|
||||
// // se trovo di nuovo un'intersezione orientata come la prima dello spillone allora ho un nuovo start e posso chiudere l'intervallo precedente
|
||||
// else if( bFirstEndFound && bDirStart == bDir) {
|
||||
// pStartEnd.second = w - 1 ;
|
||||
// bFirstEndFound = false ;
|
||||
// vvStartEnds.push_back(pStartEnd) ;
|
||||
// pStartEnd.first = w ;
|
||||
// pStartEnd.second = -1 ;
|
||||
// }
|
||||
// }
|
||||
// for( auto p : vvStartEnds )
|
||||
// SubtractIntervals(nGrid, i, j, vInters[p.first].first.z, vInters[p.second].first.z, vInters[p.first].second, vInters[p.second].second, nToolNum) ;
|
||||
//}
|
||||
//else if ( vInters.size() == 2){
|
||||
// vvStartEnds.push_back(INTINT(0, 1)) ;
|
||||
// SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ;
|
||||
//}
|
||||
//else if ( vInters.size() == 1)
|
||||
// return false ;
|
||||
|
||||
// interseco con la prima metà del tool in posizione iniziale e con la seconda metà del tool in posizione finale
|
||||
PNTVEC3DVECTOR vIntersTool ;
|
||||
//PNTVEC3DVECTOR vIntersTool ;
|
||||
BOOLVECTOR vbUpdate( 2) ;
|
||||
PNTVECTOR vPntInters( 2) ;
|
||||
VCT3DVECTOR vVtIntersNorm( 2) ;
|
||||
@@ -2304,76 +2302,108 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt
|
||||
}
|
||||
}
|
||||
|
||||
// se solo una delle due intersezioni è da scartare, allora la sostituisco con un punto all'interno della più vicina intersezione con
|
||||
// il volume identificato dalle bilineari
|
||||
int nPointToAdjust = -1 ;
|
||||
if( vbUpdate[0] && ! vbUpdate[1])
|
||||
nPointToAdjust = 1 ;
|
||||
if( ! vbUpdate[0] && vbUpdate[1])
|
||||
nPointToAdjust = 0 ;
|
||||
if ( nPointToAdjust != -1) {
|
||||
// se sto per buttare via l'intersezione, la sposto invece all'interno dell'intervallo di intersezione fatto dal volume definito dalle bilineari
|
||||
// se non ho neanche questa intersezione allora posso buttare via tutto
|
||||
int nVol = -1 ;
|
||||
bool bStartOrEndPair = false ; // true = start ; false = end
|
||||
double dMinDist = INFINITO ;
|
||||
int nClosePair = -1 ; // coppia più vicina
|
||||
for( int v = 0 ; v < int( vvnSurf.size()) ; ++v) {
|
||||
// se sto per buttare via l'intersezione, la sposto invece all'interno dell'intervallo di intersezione fatto dal volume definito dalle bilineari
|
||||
// se non ho neanche questa intersezione allora posso buttare via tutto
|
||||
if ( vvInters[v].size() != 0 ) {
|
||||
int c = 0 ;
|
||||
for ( auto& pair : vvStartEnds[v]) {
|
||||
double dDist = Dist( vPntInters[nPointToAdjust], vvInters[v][pair.first].first) ;
|
||||
if ( dDist < dMinDist ) {
|
||||
dMinDist = dDist ;
|
||||
bStartOrEndPair = true ;
|
||||
nClosePair = c ;
|
||||
nVol = v ;
|
||||
}
|
||||
dDist = Dist( vPntInters[nPointToAdjust], vvInters[v][pair.second].first) ;
|
||||
if ( dDist < dMinDist) {
|
||||
dMinDist = dDist ;
|
||||
bStartOrEndPair = false ;
|
||||
nClosePair = c ;
|
||||
nVol = v ;
|
||||
}
|
||||
++c ;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( nClosePair != -1) {
|
||||
if( bStartOrEndPair)
|
||||
vPntInters[nPointToAdjust] = vvInters[nVol][vvStartEnds[nVol][nClosePair].first].first ;
|
||||
else
|
||||
vPntInters[nPointToAdjust] = vvInters[nVol][vvStartEnds[nVol][nClosePair].second].first ;
|
||||
vbUpdate[nPointToAdjust] = true ;
|
||||
}
|
||||
// se non ho trovato intersezioni con la bilineare allora provo a tenere il punto originale
|
||||
else
|
||||
vbUpdate[nPointToAdjust] = true ;
|
||||
}
|
||||
//// se solo una delle due intersezioni è da scartare, allora la sostituisco con un punto all'interno della più vicina intersezione con
|
||||
//// il volume identificato dalle bilineari
|
||||
//int nPointToAdjust = -1 ;
|
||||
//if( vbUpdate[0] && ! vbUpdate[1])
|
||||
// nPointToAdjust = 1 ;
|
||||
//if( ! vbUpdate[0] && vbUpdate[1])
|
||||
// nPointToAdjust = 0 ;
|
||||
//if ( nPointToAdjust != -1) {
|
||||
// // se sto per buttare via l'intersezione, la sposto invece all'interno dell'intervallo di intersezione fatto dal volume definito dalle bilineari
|
||||
// // se non ho neanche questa intersezione allora posso buttare via tutto
|
||||
// bool bStartOrEndPair = false ; // true = start ; false = end
|
||||
// double dMinDist = INFINITO ;
|
||||
// int nClosePair = -1 ; // coppia più vicina
|
||||
|
||||
// // se sto per buttare via l'intersezione, la sposto invece all'interno dell'intervallo di intersezione fatto dal volume definito dalle bilineari
|
||||
// // se non ho neanche questa intersezione allora posso buttare via tutto
|
||||
// if ( vInters.size() != 0) {
|
||||
// int c = 0 ;
|
||||
// for ( auto& pair : vvStartEnds) {
|
||||
// double dDist = Dist( vPntInters[nPointToAdjust], vInters[pair.first].first) ;
|
||||
// if ( dDist < dMinDist ) {
|
||||
// dMinDist = dDist ;
|
||||
// bStartOrEndPair = true ;
|
||||
// nClosePair = c ;
|
||||
// }
|
||||
// dDist = Dist( vPntInters[nPointToAdjust], vInters[pair.second].first) ;
|
||||
// if ( dDist < dMinDist) {
|
||||
// dMinDist = dDist ;
|
||||
// bStartOrEndPair = false ;
|
||||
// nClosePair = c ;
|
||||
// }
|
||||
// ++c ;
|
||||
// }
|
||||
// }
|
||||
// if( nClosePair != -1) {
|
||||
// if( bStartOrEndPair)
|
||||
// vPntInters[nPointToAdjust] = vInters[vvStartEnds[nClosePair].first].first ;
|
||||
// else
|
||||
// vPntInters[nPointToAdjust] = vInters[vvStartEnds[nClosePair].second].first ;
|
||||
// vbUpdate[nPointToAdjust] = true ;
|
||||
// }
|
||||
// // se non ho trovato intersezioni con la bilineare allora provo a tenere il punto originale
|
||||
// else
|
||||
// vbUpdate[nPointToAdjust] = true ;
|
||||
//}
|
||||
|
||||
|
||||
if ( vbUpdate[0]) {
|
||||
UpdateMaxMin( vPntInters[0], vVtIntersNorm[0], vIntersTool) ;
|
||||
UpdateMaxMin( vPntInters[0], vVtIntersNorm[0], vInters) ;
|
||||
|
||||
//debug
|
||||
vSurfInters.push_back( t == 0 ? -1 : -2) ;
|
||||
}
|
||||
if ( vbUpdate[1]) {
|
||||
UpdateMaxMin( vPntInters[1], vVtIntersNorm[1], vIntersTool) ;
|
||||
UpdateMaxMin( vPntInters[1], vVtIntersNorm[1], vInters) ;
|
||||
|
||||
//debug
|
||||
vSurfInters.push_back( t == 0 ? -1 : -2) ;
|
||||
}
|
||||
}
|
||||
|
||||
if ( vIntersTool.size() == 2) {
|
||||
sort( vIntersTool.begin(), vIntersTool.end(), []( PNTVEC3D& a, PNTVEC3D& b){ return a.first.z < b.first.z ;}) ;
|
||||
SubtractIntervals( nGrid, i, j, vIntersTool.front().first.z, vIntersTool.back().first.z, vIntersTool.front().second, vIntersTool.back().second, nToolNum) ;
|
||||
vIntersTool.clear() ;
|
||||
//if ( vIntersTool.size() == 2) {
|
||||
// sort( vIntersTool.begin(), vIntersTool.end(), []( PNTVEC3D& a, PNTVEC3D& b){ return a.first.z < b.first.z ;}) ;
|
||||
// SubtractIntervals( nGrid, i, j, vIntersTool.front().first.z, vIntersTool.back().first.z, vIntersTool.front().second, vIntersTool.back().second, nToolNum) ;
|
||||
// vIntersTool.clear() ;
|
||||
//}
|
||||
|
||||
if ( vInters.size() > 2) {
|
||||
sort( vInters.begin(), vInters.end(), [](PNTVEC3D& a, PNTVEC3D& b) { return a.first.z < b.first.z ; }) ;
|
||||
INTINT pStartEnd ;
|
||||
bool bDirStart = vInters.front().second * Z_AX > 0 ;
|
||||
bool bFirstEndFound = false ;
|
||||
pStartEnd.first = 0 ;
|
||||
for ( int w = 1 ; w < int( vInters.size()) ; ++w) {
|
||||
bool bDir = vInters[w].second * Z_AX > 0 ;
|
||||
// se è l'ultimo punto esco
|
||||
if ( w == int( vInters.size() - 1) && bDirStart != bDir) {
|
||||
pStartEnd.second = w ;
|
||||
vvStartEnds.push_back(pStartEnd) ;
|
||||
break ;
|
||||
}
|
||||
// sennò scorro finché non trovo l'uscita più lontana ( prima di un altro ingresso o eventualmente l'ultima inters)
|
||||
else if( bDirStart != bDir)
|
||||
bFirstEndFound = true ;
|
||||
// se trovo di nuovo un'intersezione orientata come la prima dello spillone allora ho un nuovo start e posso chiudere l'intervallo precedente
|
||||
else if( bFirstEndFound && bDirStart == bDir) {
|
||||
pStartEnd.second = w - 1 ;
|
||||
bFirstEndFound = false ;
|
||||
vvStartEnds.push_back(pStartEnd) ;
|
||||
pStartEnd.first = w ;
|
||||
pStartEnd.second = -1 ;
|
||||
}
|
||||
}
|
||||
for( auto p : vvStartEnds )
|
||||
SubtractIntervals(nGrid, i, j, vInters[p.first].first.z, vInters[p.second].first.z, vInters[p.first].second, vInters[p.second].second, nToolNum) ;
|
||||
}
|
||||
else if ( vInters.size() == 2){
|
||||
vvStartEnds.push_back(INTINT(0, 1)) ;
|
||||
SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ;
|
||||
}
|
||||
else if( vInters.size() == 1)
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user