EgtGeomKernel :

- correzione a creazione arco con Set2PNB quando deltaN < epsilon
- dump di CurveComposite limitato a 1000 entità
- correzione in Zmap a calcolo spillone con movimento ortogonale di sfera.
This commit is contained in:
Dario Sassi
2018-05-23 13:28:32 +00:00
parent 6d82a47214
commit 67cd4ef923
5 changed files with 80 additions and 101 deletions
+25 -55
View File
@@ -4760,38 +4760,21 @@ VolZmap::CompPar_Milling( unsigned int nGrid, double dLenX, double dLenY, double
bool
VolZmap::CompBall_Milling( unsigned int nGrid, const Point3d & ptLs, const Point3d & ptLe, double dRad)
{
// Verifico interferisca
unsigned int nStartI, nStartJ, nEndI, nEndJ ;
bool bInterf = BBoxComponent( nGrid, ptLs, ptLe, V_NULL, nStartI, nStartJ, nEndI, nEndJ, dRad, 0, 0) ;
if ( ! bInterf)
if ( ! bInterf)
return true ;
// Vettore modivemnto
Vector3d vtV = ptLe - ptLs ;
double dLengthPath = vtV.Len() ;
vtV.Normalize() ;
Vector3d vtW ;
// Costruisco sistema di riferimento
if ( vtV.x * vtV.x > 0.09)
vtW.Set( - ( vtV.y + vtV.z) / vtV.x, 1, 1) ;
else if ( vtV.y * vtV.y > 0.09)
vtW.Set( 1, - ( vtV.x + vtV.z) / vtV.y, 1) ;
else
vtW.Set( 1, 1, - ( vtV.x + vtV.y) / vtV.z) ;
//Point3d ptOnX = ptLs + vtW ;
Frame3d CylFrame ; CylFrame.Set( ptLs, vtV, vtW) ;
// Riferimento per cilindro inviluppo della sfera lungo il movimento
Frame3d CylFrame ;
CylFrame.Set( ptLs, vtV) ;
double dSqRad = dRad * dRad ;
double dMin, dMax ;
Vector3d vtNmin, vtNmax ;
for ( unsigned int i = nStartI ; i <= nEndI ; ++ i) {
for ( unsigned int j = nStartJ ; j <= nEndJ ; ++ j) {
@@ -4803,62 +4786,49 @@ VolZmap::CompBall_Milling( unsigned int nGrid, const Point3d & ptLs, const Point
double dStSqDXY = SqDistXY( ptC, ptLs) ;
double dEnSqDXY = SqDistXY( ptC, ptLe) ;
// Prima sfera
// Sfera in posizione start
if ( dStSqDXY < dSqRad) {
dMin = ptLs.z - sqrt( dSqRad - dStSqDXY) ;
dMax = ptLs.z + sqrt( dSqRad - dStSqDXY) ;
Point3d ptIntMin( dX, dY, dMin) ;
Point3d ptIntMax( dX, dY, dMax) ;
vtNmin = ptLs - ptIntMin ;
vtNmax = ptLs - ptIntMax ;
double dMin = ptLs.z - sqrt( dSqRad - dStSqDXY) ;
double dMax = ptLs.z + sqrt( dSqRad - dStSqDXY) ;
Vector3d vtNmin = ptLs - Point3d( dX, dY, dMin) ;
vtNmin.Normalize() ;
Vector3d vtNmax = ptLs - Point3d( dX, dY, dMax) ;
vtNmax.Normalize() ;
SubtractIntervals( nGrid, i, j, dMin, dMax, vtNmin, vtNmax) ;
}
// Seconda sfera
// Sfera in posizione end
if ( dEnSqDXY < dSqRad) {
dMin = ptLe.z - sqrt( dSqRad - dEnSqDXY) ;
dMax = ptLe.z + sqrt( dSqRad - dEnSqDXY) ;
Point3d ptIntMin( dX, dY, dMin) ;
Point3d ptIntMax( dX, dY, dMax) ;
vtNmin = ptLe - ptIntMin ;
vtNmax = ptLe - ptIntMax ;
double dMin = ptLe.z - sqrt( dSqRad - dEnSqDXY) ;
double dMax = ptLe.z + sqrt( dSqRad - dEnSqDXY) ;
Vector3d vtNmin = ptLe - Point3d( dX, dY, dMin) ;
vtNmin.Normalize() ;
Vector3d vtNmax = ptLe - Point3d( dX, dY, dMax) ;
vtNmax.Normalize() ;
SubtractIntervals( nGrid, i, j, dMin, dMax, vtNmin, vtNmax) ;
}
// Cilindro inviluppo della sfera
Point3d ptInt1, ptInt2 ;
Vector3d vtN1, vtN2 ;
// Cilindro
if ( IntersLineCylinder( ptC, Z_AX, CylFrame, dLengthPath, dRad, false, false, ptInt1, ptInt2, vtN1, vtN2)) {
if ( ptInt1.z < ptInt2.z) {
dMin = ptInt1.z ;
dMax = ptInt2.z ;
vtNmin = vtN1 ;
vtNmax = vtN2 ;
double dMin = ptInt1.z ;
double dMax = ptInt2.z ;
Vector3d vtNmin = vtN1 ;
Vector3d vtNmax = vtN2 ;
if ( ptInt1.z > ptInt2.z) {
swap( dMin, dMax) ;
swap( vtNmin, vtNmax) ;
}
else {
dMin = ptInt2.z ;
dMax = ptInt1.z ;
vtNmin = vtN2 ;
vtNmax = vtN1 ;
}
SubtractIntervals( nGrid, i, j, dMin, dMax, vtNmin, vtNmax) ;
}
}
}
return true ;
}