EgtGeomKernel : migliorata scalatura non uniforme, con conservazione del piano XY dei riferimenti di gruppo.

This commit is contained in:
Dario Sassi
2014-01-20 10:57:14 +00:00
parent 4ebb43bf1e
commit b2c6866eff
7 changed files with 115 additions and 15 deletions
+38
View File
@@ -196,6 +196,44 @@ Frame3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, doub
return true ;
}
//----------------------------------------------------------------------------
bool
Frame3d::PartialScale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
{
const double AXIS_LEN = 100 ;
// verifico validità del frame
if ( GetType() == ERR || frRef.GetType() == ERR)
return false ;
// scalatura dell'origine
Point3d ptOrigS = m_ptOrig ;
ptOrigS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
// calcolo trasformazione del versore Z
Point3d ptDirZS = m_ptOrig + AXIS_LEN * m_vtVersZ ;
ptDirZS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Vector3d vtVersZS = ptDirZS - ptOrigS ;
vtVersZS.Normalize() ;
// se il versore Z non cambia, basta applicare l'origine scalata
if ( AreSameVectorExact( m_vtVersZ, vtVersZS)) {
m_ptOrig = ptOrigS ;
return true ;
}
// altrimenti, devo scalare anche i versori X e Y
Point3d ptDirXS = m_ptOrig + AXIS_LEN * m_vtVersX ;
ptDirXS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Point3d ptDirYS = m_ptOrig + AXIS_LEN * m_vtVersY ;
ptDirYS.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ) ;
Frame3d frRefS ;
if ( frRefS.Set( ptOrigS, ptDirXS, ptDirYS)) {
*this = frRefS ;
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
bool
Frame3d::Invert( void)