EgtGeomKernel :
- corretto un bug nel taglio spilloni.
This commit is contained in:
+156
-172
@@ -1332,7 +1332,7 @@ struct SurfBezForInters {
|
||||
//----------------------------------------------------------------------------
|
||||
static bool
|
||||
IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir,
|
||||
const vector<SurfBezForInters>& vSurfBez, PNTVEC3DVECTOR& vInters, INTVECTOR& vSurfInters,
|
||||
const vector<SurfBezForInters>& vSurfBez, const BBox3d& bbVol, PNTVEC3DVECTOR& vInters, INTVECTOR& vSurfInters,
|
||||
const Vector3d& vtN, DBLDBLVECTOR& vInterv)
|
||||
{
|
||||
Point3d r = ptLineStart ;
|
||||
@@ -1350,185 +1350,165 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir,
|
||||
r.ToLoc( frRot) ;
|
||||
q.ToLoc( frRot) ;
|
||||
}
|
||||
// salvo un vettore di flag per tenere traccia delle superfici con cui ho trovato delle intersezioni
|
||||
BOOLVECTOR vbAlreadyCalc( vSurfBez.size()) ;
|
||||
fill( vbAlreadyCalc.begin(), vbAlreadyCalc.end(), false) ;
|
||||
bool bCalcAll = false ;
|
||||
|
||||
// calcolo se un intevallo sul dexel interseca il box dell'intero volume spazzato
|
||||
bool bIntersVol = false ;
|
||||
for ( int k = 0 ; k < int(vInterv.size()) && ! bIntersVol; ++k) {
|
||||
INTDBLVECTOR vIntersDash ;
|
||||
IntersLineBox( r + q* vInterv[k].first, r + q * vInterv[k].second, bbVol, vIntersDash, true) ;
|
||||
bIntersVol = vIntersDash.size() > 0 ;
|
||||
}
|
||||
// se non sono stati passati gli intervalli allora vuol dire che lo spillone interseca
|
||||
if ( vInterv.size() == 0)
|
||||
bIntersVol = true ;
|
||||
|
||||
Reiterate :
|
||||
INTVECTOR vIntersCalc ; // debug
|
||||
if( bIntersVol) {
|
||||
// interseco con le bezier
|
||||
for ( int s = 0 ; s < int( vSurfBez.size()) ; ++s) {
|
||||
// se ho già trovato l'intersezione con questa superficie vado avanti
|
||||
|
||||
// interseco con le bezier
|
||||
for ( int s = 0 ; s < int( vSurfBez.size()) ; ++s) {
|
||||
// se ho già trovato l'intersezione con questa superficie vado avanti
|
||||
if ( vbAlreadyCalc[s])
|
||||
continue ;
|
||||
|
||||
const SurfBezForInters& srf = vSurfBez[s] ;
|
||||
BBox3d bbox = srf.bbSurfOriented;
|
||||
bool bNotValid = false ;
|
||||
Point3d rLoc = r ;
|
||||
Vector3d qLoc = q ;
|
||||
if ( ! bNeedToRot) {
|
||||
rLoc.ToLoc( srf.frBox) ;
|
||||
qLoc.ToLoc( srf.frBox) ;
|
||||
}
|
||||
else {
|
||||
rLoc.LocToLoc( frRot, srf.frBox) ;
|
||||
qLoc.LocToLoc( frRot, srf.frBox) ;
|
||||
}
|
||||
|
||||
INTDBLVECTOR vIntBoxBox ;
|
||||
bool bCalcInters = false ;
|
||||
// vettore degli intervalli che intersecano il box della superficie
|
||||
INTVECTOR vIntervInters ;
|
||||
// verifico se uno degli intervalli sul voxel interseca il box
|
||||
if ( vInterv.size() > 0 && ! bCalcAll) {
|
||||
for ( int k = 0 ; k < int( vInterv.size()) ; ++k) {
|
||||
INTDBLVECTOR vIntersDash ;
|
||||
IntersLineBox( rLoc + qLoc * vInterv[k].first, rLoc + qLoc * vInterv[k].second, bbox, vIntersDash, true) ;
|
||||
bool bInters = vIntersDash.size() > 0 ;
|
||||
bCalcInters = bCalcInters || bInters ;
|
||||
if ( bInters)
|
||||
vIntervInters.push_back( k) ;
|
||||
}
|
||||
}
|
||||
// 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) {
|
||||
vbAlreadyCalc[s] = true ;
|
||||
|
||||
// se la linea è parallela all'asse X o Y allora ruoto tutto di 45 gradi rispetto a Z
|
||||
Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ;
|
||||
const SurfBezForInters& srf = vSurfBez[s] ;
|
||||
BBox3d bbox = srf.bbSurfOriented;
|
||||
bool bNotValid = false ;
|
||||
Point3d rLoc = r ;
|
||||
Vector3d qLoc = q ;
|
||||
if ( ! bNeedToRot) {
|
||||
a3 = srf.a3 ;
|
||||
a2 = srf.a2 ;
|
||||
a1 = srf.a1 ;
|
||||
a0 = srf.a0 ;
|
||||
b3 = srf.b3 ;
|
||||
b2 = srf.b2 ;
|
||||
b1 = srf.b1 ;
|
||||
b0 = srf.b0 ;
|
||||
rLoc.ToLoc( srf.frBox) ;
|
||||
qLoc.ToLoc( srf.frBox) ;
|
||||
}
|
||||
else {
|
||||
SurfBezier sBezRot = srf.sBez ;
|
||||
sBezRot.ToLoc( frRot) ;
|
||||
PNTVECTOR vPntCtrl = sBezRot.GetAllControlPoints() ;
|
||||
|
||||
Vector3d A = vPntCtrl[4] - vPntCtrl[0] ;
|
||||
Vector3d B = vPntCtrl[5] - vPntCtrl[1] ;
|
||||
Vector3d C = vPntCtrl[6] - vPntCtrl[2] ;
|
||||
Vector3d D = vPntCtrl[7] - vPntCtrl[3] ;
|
||||
Vector3d E = vPntCtrl[0] - ORIG ;
|
||||
Vector3d F = vPntCtrl[1] - ORIG ;
|
||||
Vector3d G = vPntCtrl[2] - ORIG ;
|
||||
Vector3d H = vPntCtrl[3] - ORIG ;
|
||||
|
||||
a3 = -A + 3*B - 3*C + D ;
|
||||
a2 = 3*A - 6*B + 3*C ;
|
||||
a1 = -3*A +3*B ;
|
||||
a0 = A ;
|
||||
|
||||
b3 = -E + 3*F - 3*G + H ;
|
||||
b2 = 3*E - 6*F + 3*G ;
|
||||
b1 = -3*E + 3*F ;
|
||||
b0 = E ;
|
||||
rLoc.LocToLoc( frRot, srf.frBox) ;
|
||||
qLoc.LocToLoc( frRot, srf.frBox) ;
|
||||
}
|
||||
|
||||
DBLVECTOR vdCoeff, vdRoots ;
|
||||
// coefficienti dal grado più basso al grado più alto
|
||||
vdCoeff = { // c0
|
||||
q.x*q.z*a0.y*b0.z - q.x*q.y*a0.z*b0.z // 3
|
||||
- r.z*q.x*q.z*a0.y + r.z*q.x*q.y*a0.z + // 3
|
||||
q.y*q.z*a0.z*b0.z - q.z*q.z*a0.y*b0.x // 4
|
||||
- r.x*q.y*q.z*a0.z + r.x*q.z*q.z*a0.y + // 4
|
||||
q.z*q.z*a0.x*b0.y - q.y*q.z*a0.x*b0.z - q.x*q.z*a0.z*b0.y + q.x*q.y*a0.z*b0.z // 5
|
||||
- r.y*q.z*q.z*a0.x + r.z*q.y*q.z*a0.x + r.y*q.x*q.z*a0.z - r.z*q.x*q.y*a0.z, // 5
|
||||
bool bCalcInters = false ;
|
||||
// verifico se il voxel interseca la box
|
||||
INTDBLVECTOR vIntersDash ;
|
||||
IntersLineBox(rLoc, qLoc, 0, bbox, vIntersDash, false) ;
|
||||
bCalcInters = vIntersDash.size() > 0 ;
|
||||
|
||||
// c1
|
||||
q.x*q.z*(a1.y*b0.z + a0.y*b1.z) - q.x*q.y*(a1.z*b0.z + a0.z*b1.z) // 3
|
||||
- r.z*q.x*q.z*a1.y + r.z*q.x*q.y*a1.z + // 3
|
||||
q.y*q.z*(a1.z*b0.x + a0.z*b1.x) - q.z*q.z*(a1.y*b0.x + a0.y*b1.x) // 4
|
||||
- r.x*q.y*q.z*a1.z + r.x*q.z*q.z*a1.y + // 4
|
||||
q.z*q.z*(a1.x*b0.y + a0.x*b1.y) - q.y*q.z*(a1.x*b0.z + a0.x*b1.z) // 5
|
||||
- q.x*q.z*(a1.z*b0.y + a0.z*b1.y) + q.x*q.y*(a1.z*b0.z + a0.z*b1.z) // 5
|
||||
- r.y*q.z*q.z*a1.x + r.z*q.y*q.z*a1.x + r.y*q.x*q.z*a1.z - r.z*q.x*q.y*a1.z, // 5
|
||||
|
||||
// c2
|
||||
q.x*q.z*(a2.y*b0.z + a1.y*b1.z + a0.y*b2.z) - q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z) // 3
|
||||
- r.z*q.x*q.z*a2.y + r.z*q.x*q.y*a2.z + // 3
|
||||
q.y*q.z*(a2.z*b0.x + a1.z*b1.x + a0.z*b2.x) - q.z*q.z*(a2.y*b0.x + a1.y*b1.x + a0.y*b2.x) // 4
|
||||
- r.x*q.y*q.z*a2.z + r.x*q.z*q.z*a2.y + // 4
|
||||
q.z*q.z*(a2.x*b0.y + a1.x*b1.y + a0.x*b2.y) - q.y*q.z*(a2.x*b0.z + a1.x*b1.z + a0.x*b2.z) // 5
|
||||
- q.x*q.z*(a2.z*b0.y + a1.z*b1.y + a0.z*b2.y) + q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z)// 5
|
||||
- r.y*q.z*q.z*a2.x + r.z*q.y*q.z*a2.x + r.y*q.x*q.z*a2.z - r.z*q.x*q.y*a2.z, // 5
|
||||
// verifico che lo spillone faccia interferenza con il box della superficie
|
||||
if ( bCalcInters) {
|
||||
|
||||
// c3
|
||||
q.x*q.z*(a3.y*b0.z + a2.y*b1.z + a1.y*b2.z + a0.y*b3.z) - q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z) // 3
|
||||
- r.z*q.x*q.z*a3.y + r.z*q.x*q.y*a3.z + // 3
|
||||
q.y*q.z*(a3.z*b0.x + a2.z*b1.x + a1.z*b2.x + a0.z*b3.x) - q.z*q.z*(a3.y*b0.x + a2.y*b1.x + a1.y*b2.x + a0.y*b3.x) // 4
|
||||
- r.x*q.y*q.z*a3.z + r.x*q.z*q.z*a3.y + // 4
|
||||
q.z*q.z*(a3.x*b0.y + a2.x*b1.y + a1.x*b2.y + a0.x*b3.y) - q.y*q.z*(a3.x*b0.z + a2.x*b1.z + a1.x*b2.z + a0.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b0.y + a2.z*b1.y + a1.z*b2.y + a0.z*b3.y) + q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z)// 5
|
||||
- r.y*q.z*q.z*a3.x + r.z*q.y*q.z*a3.x + r.y*q.x*q.z*a3.z - r.z*q.x*q.y*a3.z, // 5
|
||||
|
||||
// c4
|
||||
q.x*q.z*(a3.y*b1.z + a2.y*b2.z + a1.y*b3.z) - q.x*q.y*(a3.z*b1.z + a2.z*b2.z + a1.z*b3.z) + // 3
|
||||
q.y*q.z*(a3.z*b1.x + a2.z*b2.x + a1.z*b3.x) - q.z*q.z*(a3.y*b1.x + a2.y*b2.x + a1.y*b3.x) + // 4
|
||||
q.z*q.z*(a3.x*b1.y + a2.x*b2.y + a1.x*b3.y) - q.y*q.z*(a3.x*b1.z + a2.x*b2.z + a1.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b1.y + a2.z*b2.y + a1.z*b3.y) + q.x*q.y*(a3.z*b1.z + a2.z*b2.z + a1.z*b3.z), // 5
|
||||
vIntersCalc.push_back( s) ; // debug
|
||||
// se la linea è parallela all'asse X o Y allora ruoto tutto di 45 gradi rispetto a Z
|
||||
Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ;
|
||||
if ( ! bNeedToRot) {
|
||||
a3 = srf.a3 ;
|
||||
a2 = srf.a2 ;
|
||||
a1 = srf.a1 ;
|
||||
a0 = srf.a0 ;
|
||||
b3 = srf.b3 ;
|
||||
b2 = srf.b2 ;
|
||||
b1 = srf.b1 ;
|
||||
b0 = srf.b0 ;
|
||||
}
|
||||
else {
|
||||
SurfBezier sBezRot = srf.sBez ;
|
||||
sBezRot.ToLoc( frRot) ;
|
||||
PNTVECTOR vPntCtrl = sBezRot.GetAllControlPoints() ;
|
||||
|
||||
// c5
|
||||
q.x*q.z*(a3.y*b2.z + a2.y*b3.z) - q.x*q.y*(a3.z*b2.z + a2.z*b3.z) + // 3
|
||||
q.y*q.z*(a3.z*b2.x + a2.z*b3.x) - q.z*q.z*(a3.y*b2.x + a2.y*b3.x) + // 4
|
||||
q.z*q.z*(a3.x*b2.y + a2.x*b3.y) - q.y*q.z*(a3.x*b2.z + a2.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b2.y + a2.z*b3.y) + q.x*q.y*(a3.z*b2.z + a2.z*b3.z), // 5
|
||||
Vector3d A = vPntCtrl[4] - vPntCtrl[0] ;
|
||||
Vector3d B = vPntCtrl[5] - vPntCtrl[1] ;
|
||||
Vector3d C = vPntCtrl[6] - vPntCtrl[2] ;
|
||||
Vector3d D = vPntCtrl[7] - vPntCtrl[3] ;
|
||||
Vector3d E = vPntCtrl[0] - ORIG ;
|
||||
Vector3d F = vPntCtrl[1] - ORIG ;
|
||||
Vector3d G = vPntCtrl[2] - ORIG ;
|
||||
Vector3d H = vPntCtrl[3] - ORIG ;
|
||||
|
||||
// c6
|
||||
q.x*q.z*a3.y*b3.z - q.x*q.y*a3.z*b3.z + // 3
|
||||
q.y*q.z*a3.z*b3.x - q.z*q.z*a3.y*b3.x + // 4
|
||||
q.z*q.z*a3.x*b3.y - q.y*q.z*a3.x*b3.z - q.x*q.z*a3.z*b3.y + q.x*q.y*a3.z*b3.z} ; // 5
|
||||
int nRoots = PolynomialRoots( 6, vdCoeff, vdRoots) ;
|
||||
for ( int w = 0 ; w < nRoots ; ++w) {
|
||||
double dU = 0, dV = 0 ;
|
||||
if ( vdRoots[w] > 0 - EPS_ZERO && vdRoots[w] < 1 + EPS_ZERO) {
|
||||
dU = vdRoots[w] ;
|
||||
// verifico che non sia una soluzione con molteplicità > 1
|
||||
bool bAlreadyFound = false ;
|
||||
for ( int k = w - 1 ; k >= 0 && ! bAlreadyFound ; --k)
|
||||
bAlreadyFound = ( abs( dU - vdRoots[k]) < EPS_PARAM) ;
|
||||
if ( ! bAlreadyFound) {
|
||||
Vector3d vAlpha = a3 * pow(dU, 3) + a2 * pow( dU, 2) + a1 * dU + a0 ;
|
||||
Vector3d vBeta = b3 * pow(dU, 3) + b2 * pow( dU, 2) + b1 * dU + b0 ;
|
||||
double dDen = ( vAlpha.x * q.z - vAlpha.z * q.x) ;
|
||||
if ( abs( dDen) > EPS_ZERO)
|
||||
dV = ( ( vBeta.z - r.z) * q.x - ( vBeta.x - r.x ) * q.z) / dDen ;
|
||||
else {
|
||||
// se la prima equazione risulta un x/0 allora uso la seconda equazione per trovare il secondo parametro
|
||||
double dDen2 = ( vAlpha.y * q.z - vAlpha.z * q.y) ;
|
||||
dV = ( ( vBeta.z - r.z) * q.y - ( vBeta.y - r.y ) * q.z) / dDen2 ;
|
||||
}
|
||||
if ( dV > - EPS_ZERO && dV < 1 + EPS_ZERO) {
|
||||
Point3d ptBez ;
|
||||
Vector3d vtN ;
|
||||
srf.sBez.GetPointNrmD1D2(dU, dV, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez, vtN) ;
|
||||
vtN *= -1 ;
|
||||
UpdateMaxMin( ptBez, vtN, vInters) ;
|
||||
vSurfInters.push_back( s) ;
|
||||
a3 = -A + 3*B - 3*C + D ;
|
||||
a2 = 3*A - 6*B + 3*C ;
|
||||
a1 = -3*A +3*B ;
|
||||
a0 = A ;
|
||||
|
||||
// se ho trovato un'intersezione all'interno dell'intervallo, esistente sullo spillone e che si interseca con il box, allora devo ricontrollare
|
||||
// anche le superfici i cui box non facevano intersezione con l'intervallo
|
||||
if ( vIntervInters.size() > 0 && ! bNeedToRot && ! bCalcAll) {
|
||||
for (int i : vIntervInters) {
|
||||
if (vInterv[i].first < ptBez.z && ptBez.z < vInterv[i].second) {
|
||||
bCalcAll = true ;
|
||||
goto Reiterate ;
|
||||
}
|
||||
}
|
||||
b3 = -E + 3*F - 3*G + H ;
|
||||
b2 = 3*E - 6*F + 3*G ;
|
||||
b1 = -3*E + 3*F ;
|
||||
b0 = E ;
|
||||
}
|
||||
|
||||
DBLVECTOR vdCoeff, vdRoots ;
|
||||
// coefficienti dal grado più basso al grado più alto
|
||||
vdCoeff = { // c0
|
||||
q.x*q.z*a0.y*b0.z - q.x*q.y*a0.z*b0.z // 3
|
||||
- r.z*q.x*q.z*a0.y + r.z*q.x*q.y*a0.z + // 3
|
||||
q.y*q.z*a0.z*b0.z - q.z*q.z*a0.y*b0.x // 4
|
||||
- r.x*q.y*q.z*a0.z + r.x*q.z*q.z*a0.y + // 4
|
||||
q.z*q.z*a0.x*b0.y - q.y*q.z*a0.x*b0.z - q.x*q.z*a0.z*b0.y + q.x*q.y*a0.z*b0.z // 5
|
||||
- r.y*q.z*q.z*a0.x + r.z*q.y*q.z*a0.x + r.y*q.x*q.z*a0.z - r.z*q.x*q.y*a0.z, // 5
|
||||
|
||||
// c1
|
||||
q.x*q.z*(a1.y*b0.z + a0.y*b1.z) - q.x*q.y*(a1.z*b0.z + a0.z*b1.z) // 3
|
||||
- r.z*q.x*q.z*a1.y + r.z*q.x*q.y*a1.z + // 3
|
||||
q.y*q.z*(a1.z*b0.x + a0.z*b1.x) - q.z*q.z*(a1.y*b0.x + a0.y*b1.x) // 4
|
||||
- r.x*q.y*q.z*a1.z + r.x*q.z*q.z*a1.y + // 4
|
||||
q.z*q.z*(a1.x*b0.y + a0.x*b1.y) - q.y*q.z*(a1.x*b0.z + a0.x*b1.z) // 5
|
||||
- q.x*q.z*(a1.z*b0.y + a0.z*b1.y) + q.x*q.y*(a1.z*b0.z + a0.z*b1.z) // 5
|
||||
- r.y*q.z*q.z*a1.x + r.z*q.y*q.z*a1.x + r.y*q.x*q.z*a1.z - r.z*q.x*q.y*a1.z, // 5
|
||||
|
||||
// c2
|
||||
q.x*q.z*(a2.y*b0.z + a1.y*b1.z + a0.y*b2.z) - q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z) // 3
|
||||
- r.z*q.x*q.z*a2.y + r.z*q.x*q.y*a2.z + // 3
|
||||
q.y*q.z*(a2.z*b0.x + a1.z*b1.x + a0.z*b2.x) - q.z*q.z*(a2.y*b0.x + a1.y*b1.x + a0.y*b2.x) // 4
|
||||
- r.x*q.y*q.z*a2.z + r.x*q.z*q.z*a2.y + // 4
|
||||
q.z*q.z*(a2.x*b0.y + a1.x*b1.y + a0.x*b2.y) - q.y*q.z*(a2.x*b0.z + a1.x*b1.z + a0.x*b2.z) // 5
|
||||
- q.x*q.z*(a2.z*b0.y + a1.z*b1.y + a0.z*b2.y) + q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z)// 5
|
||||
- r.y*q.z*q.z*a2.x + r.z*q.y*q.z*a2.x + r.y*q.x*q.z*a2.z - r.z*q.x*q.y*a2.z, // 5
|
||||
|
||||
// c3
|
||||
q.x*q.z*(a3.y*b0.z + a2.y*b1.z + a1.y*b2.z + a0.y*b3.z) - q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z) // 3
|
||||
- r.z*q.x*q.z*a3.y + r.z*q.x*q.y*a3.z + // 3
|
||||
q.y*q.z*(a3.z*b0.x + a2.z*b1.x + a1.z*b2.x + a0.z*b3.x) - q.z*q.z*(a3.y*b0.x + a2.y*b1.x + a1.y*b2.x + a0.y*b3.x) // 4
|
||||
- r.x*q.y*q.z*a3.z + r.x*q.z*q.z*a3.y + // 4
|
||||
q.z*q.z*(a3.x*b0.y + a2.x*b1.y + a1.x*b2.y + a0.x*b3.y) - q.y*q.z*(a3.x*b0.z + a2.x*b1.z + a1.x*b2.z + a0.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b0.y + a2.z*b1.y + a1.z*b2.y + a0.z*b3.y) + q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z)// 5
|
||||
- r.y*q.z*q.z*a3.x + r.z*q.y*q.z*a3.x + r.y*q.x*q.z*a3.z - r.z*q.x*q.y*a3.z, // 5
|
||||
|
||||
// c4
|
||||
q.x*q.z*(a3.y*b1.z + a2.y*b2.z + a1.y*b3.z) - q.x*q.y*(a3.z*b1.z + a2.z*b2.z + a1.z*b3.z) + // 3
|
||||
q.y*q.z*(a3.z*b1.x + a2.z*b2.x + a1.z*b3.x) - q.z*q.z*(a3.y*b1.x + a2.y*b2.x + a1.y*b3.x) + // 4
|
||||
q.z*q.z*(a3.x*b1.y + a2.x*b2.y + a1.x*b3.y) - q.y*q.z*(a3.x*b1.z + a2.x*b2.z + a1.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b1.y + a2.z*b2.y + a1.z*b3.y) + q.x*q.y*(a3.z*b1.z + a2.z*b2.z + a1.z*b3.z), // 5
|
||||
|
||||
// c5
|
||||
q.x*q.z*(a3.y*b2.z + a2.y*b3.z) - q.x*q.y*(a3.z*b2.z + a2.z*b3.z) + // 3
|
||||
q.y*q.z*(a3.z*b2.x + a2.z*b3.x) - q.z*q.z*(a3.y*b2.x + a2.y*b3.x) + // 4
|
||||
q.z*q.z*(a3.x*b2.y + a2.x*b3.y) - q.y*q.z*(a3.x*b2.z + a2.x*b3.z) // 5
|
||||
- q.x*q.z*(a3.z*b2.y + a2.z*b3.y) + q.x*q.y*(a3.z*b2.z + a2.z*b3.z), // 5
|
||||
|
||||
// c6
|
||||
q.x*q.z*a3.y*b3.z - q.x*q.y*a3.z*b3.z + // 3
|
||||
q.y*q.z*a3.z*b3.x - q.z*q.z*a3.y*b3.x + // 4
|
||||
q.z*q.z*a3.x*b3.y - q.y*q.z*a3.x*b3.z - q.x*q.z*a3.z*b3.y + q.x*q.y*a3.z*b3.z} ; // 5
|
||||
int nRoots = PolynomialRoots( 6, vdCoeff, vdRoots) ;
|
||||
for ( int w = 0 ; w < nRoots ; ++w) {
|
||||
double dU = 0, dV = 0 ;
|
||||
if ( vdRoots[w] > 0 - EPS_ZERO && vdRoots[w] < 1 + EPS_ZERO) {
|
||||
dU = vdRoots[w] ;
|
||||
// verifico che non sia una soluzione con molteplicità > 1
|
||||
bool bAlreadyFound = false ;
|
||||
for ( int k = w - 1 ; k >= 0 && ! bAlreadyFound ; --k)
|
||||
bAlreadyFound = ( abs( dU - vdRoots[k]) < EPS_PARAM) ;
|
||||
if ( ! bAlreadyFound) {
|
||||
Vector3d vAlpha = a3 * pow(dU, 3) + a2 * pow( dU, 2) + a1 * dU + a0 ;
|
||||
Vector3d vBeta = b3 * pow(dU, 3) + b2 * pow( dU, 2) + b1 * dU + b0 ;
|
||||
double dDen = ( vAlpha.x * q.z - vAlpha.z * q.x) ;
|
||||
if ( abs( dDen) > EPS_ZERO)
|
||||
dV = ( ( vBeta.z - r.z) * q.x - ( vBeta.x - r.x ) * q.z) / dDen ;
|
||||
else {
|
||||
// se la prima equazione risulta un x/0 allora uso la seconda equazione per trovare il secondo parametro
|
||||
double dDen2 = ( vAlpha.y * q.z - vAlpha.z * q.y) ;
|
||||
dV = ( ( vBeta.z - r.z) * q.y - ( vBeta.y - r.y ) * q.z) / dDen2 ;
|
||||
}
|
||||
if ( dV > - EPS_ZERO && dV < 1 + EPS_ZERO) {
|
||||
Point3d ptBez ;
|
||||
Vector3d vtN ;
|
||||
srf.sBez.GetPointNrmD1D2(dU, dV, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez, vtN) ;
|
||||
vtN *= -1 ;
|
||||
UpdateMaxMin( ptBez, vtN, vInters) ;
|
||||
vSurfInters.push_back( s) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1581,6 +1561,8 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
|
||||
int nSurfInd = 0 ;
|
||||
vector<SurfBezForInters> vSurfBez( nTotSurf) ;
|
||||
// box dell'intero volume spazzato, nel riferimento globale
|
||||
BBox3d bbVol = GetCylMoveRotBBox( ptS, ptE, vtLs, vtLe, dMaxRad, dHeight) ;
|
||||
double dSide = 0 ;
|
||||
|
||||
// punti di riferimento sul tool
|
||||
@@ -2001,8 +1983,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
} ;
|
||||
vector<IntervalsToSubtract> vIntervalsToSubtr ;
|
||||
|
||||
#ifdef TEST
|
||||
//debug
|
||||
if (nStepCounter >= 153) {
|
||||
if (nStepCounter >= 153 && false) {
|
||||
if (nGrid == 2)
|
||||
int d = 0;
|
||||
if (nStepCounter == 153) {
|
||||
@@ -2016,6 +1999,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
}
|
||||
|
||||
//debug
|
||||
#endif
|
||||
|
||||
for ( int i = nStartI ; i <= nEndI ; ++ i) {
|
||||
nLastForwardJ = -1 ;
|
||||
@@ -2038,7 +2022,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
vInterv.emplace_back( vDexel[k].dMin, vDexel[k].dMax) ;
|
||||
|
||||
if ( vDexel.size() != 0) {
|
||||
IntersLineBezierSurfSet( r, q, vSurfBez, vInters, vSurfInters, vtLs, vInterv) ;
|
||||
IntersLineBezierSurfSet( r, q, vSurfBez, bbVol, vInters, vSurfInters, vtLs, vInterv) ;
|
||||
|
||||
if ( vInters.size() > 2) {
|
||||
SortGroupInters( vInters, vStartEnds, Z_AX) ;
|
||||
@@ -2062,7 +2046,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
INTVECTOR vSurfX ;
|
||||
INTINTVECTOR vStartEndsX ;
|
||||
bool bXInclude = false ;
|
||||
IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersX, vSurfX, V_NULL, vEmpty) ;
|
||||
IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, bbVol, vIntersX, vSurfX, V_NULL, vEmpty) ;
|
||||
if ( vIntersX.size() > 1) {
|
||||
SortGroupInters( vIntersX, vStartEndsX, X_AX) ;
|
||||
if ( vStartEndsX.size() != 0)
|
||||
@@ -2076,7 +2060,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
INTVECTOR vSurfY ;
|
||||
INTINTVECTOR vStartEndsY ;
|
||||
bool bYInclude = false ;
|
||||
IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersY, vSurfY, V_NULL, vEmpty) ;
|
||||
IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, bbVol, vIntersY, vSurfY, V_NULL, vEmpty) ;
|
||||
if ( vIntersY.size() > 1) {
|
||||
SortGroupInters( vIntersY, vStartEndsY, Y_AX) ;
|
||||
if ( vStartEndsY.size() != 0)
|
||||
|
||||
Reference in New Issue
Block a user