fix bug #52: Transform::inverse() should return a Transform

This commit is contained in:
Benoit Jacob 2009-09-18 18:45:45 -04:00
parent fcae32cc3f
commit 760636a237
2 changed files with 13 additions and 13 deletions

View File

@ -395,7 +395,7 @@ public:
Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
inline const MatrixType inverse(TransformTraits traits = (TransformTraits)Mode) const;
inline Transform inverse(TransformTraits traits = (TransformTraits)Mode) const;
/** \returns a const pointer to the column major internal matrix */
const Scalar* data() const { return m_matrix.data(); }
@ -874,7 +874,7 @@ Transform<Scalar,Dim,Mode>::fromPositionOrientationScale(const MatrixBase<Positi
/** \nonstableyet
*
* \returns the inverse transformation matrix according to some given knowledge
* \returns the inverse transformation according to some given knowledge
* on \c *this.
*
* \param traits allows to optimize the inversion process when the transformion
@ -892,37 +892,37 @@ Transform<Scalar,Dim,Mode>::fromPositionOrientationScale(const MatrixBase<Positi
* \sa MatrixBase::inverse()
*/
template<typename Scalar, int Dim, int Mode>
const typename Transform<Scalar,Dim,Mode>::MatrixType
Transform<Scalar,Dim,Mode>
Transform<Scalar,Dim,Mode>::inverse(TransformTraits hint) const
{
Transform res;
if (hint == Projective)
{
return m_matrix.inverse();
res.matrix() = m_matrix.inverse();
}
else
{
MatrixType res;
if (hint == Isometry)
{
res.template corner<Dim,Dim>(TopLeft) = linear().transpose();
res.matrix().template corner<Dim,Dim>(TopLeft) = linear().transpose();
}
else if(hint&Affine)
{
res.template corner<Dim,Dim>(TopLeft) = linear().inverse();
res.matrix().template corner<Dim,Dim>(TopLeft) = linear().inverse();
}
else
{
ei_assert(false && "Invalid transform traits in Transform::Inverse");
}
// translation and remaining parts
res.template corner<Dim,1>(TopRight) = - res.template corner<Dim,Dim>(TopLeft) * translation();
res.matrix().template corner<Dim,1>(TopRight) = - res.matrix().template corner<Dim,Dim>(TopLeft) * translation();
if(int(Mode)!=int(AffineCompact))
{
res.template block<1,Dim>(Dim,0).setZero();
res.coeffRef(Dim,Dim) = 1;
res.matrix().template block<1,Dim>(Dim,0).setZero();
res.matrix().coeffRef(Dim,Dim) = 1;
}
return res;
}
return res;
}
/*****************************************************

View File

@ -296,10 +296,10 @@ template<typename Scalar, int Mode> void transformations(void)
t0.setIdentity();
t0.translate(v0);
t0.linear().setRandom();
VERIFY_IS_APPROX(t0.inverse(Affine), t0.matrix().inverse());
VERIFY_IS_APPROX(t0.inverse(Affine).matrix(), t0.matrix().inverse());
t0.setIdentity();
t0.translate(v0).rotate(q1);
VERIFY_IS_APPROX(t0.inverse(Isometry), t0.matrix().inverse());
VERIFY_IS_APPROX(t0.inverse(Isometry).matrix(), t0.matrix().inverse());
}
// test extract rotation and aligned scaling