EgtGeomKernel : migliorata scalatura non uniforme, con conservazione del piano XY dei riferimenti di gruppo.
This commit is contained in:
+38
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user