diff --git a/BBox3d.cpp b/BBox3d.cpp index 655e40d..1b5c869 100644 --- a/BBox3d.cpp +++ b/BBox3d.cpp @@ -187,6 +187,54 @@ BBox3d::GetRadius( double& dRad) const return true ; } +//---------------------------------------------------------------------------- +void +BBox3d::Translate( const Vector3d& vtMove) +{ + if ( ! IsValid()) + return ; + // non essendoci cambio di orientamento, traslo semplicemente i punti + m_ptMin = m_ptMin + vtMove ; + m_ptMax = m_ptMax + vtMove ; +} + +//---------------------------------------------------------------------------- +bool +BBox3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg) +{ + double dAngRad = dAngDeg * DEGTORAD ; + return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ; +} + +//---------------------------------------------------------------------------- +bool +BBox3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng) +{ + if ( ! IsValid()) + return false ; + // ruoto il minimo + Point3d ptMinRot = m_ptMin ; + if ( ! ptMinRot.Rotate( ptAx, vtAx, dCosAng, dSinAng)) + return false ; + // ruoto i vettori dal Min al Max diretti come gli assi locali + Vector3d vtXRot( m_ptMax.x - m_ptMin.x, 0, 0) ; + vtXRot.Rotate( vtAx, dCosAng, dSinAng) ; + Vector3d vtYRot( 0, m_ptMax.y - m_ptMin.y, 0) ; + vtYRot.Rotate( vtAx, dCosAng, dSinAng) ; + Vector3d vtZRot( 0, 0, m_ptMax.z - m_ptMin.z) ; + vtZRot.Rotate( vtAx, dCosAng, dSinAng) ; + // calcolo il box trasformato + Set( ptMinRot) ; + Add( ptMinRot + vtXRot) ; + Add( ptMinRot + vtYRot) ; + Add( ptMinRot + vtZRot) ; + Add( ptMinRot + vtXRot + vtYRot) ; + Add( ptMinRot + vtYRot + vtZRot) ; + Add( ptMinRot + vtZRot + vtXRot) ; + Add( ptMinRot + vtXRot + vtYRot + vtZRot) ; + return true ; +} + //---------------------------------------------------------------------------- bool BBox3d::ToGlob( const Frame3d& frRef) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 6564e65..67ce21c 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ