mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
add uniform scale/prescale functions in Tranform
This commit is contained in:
parent
9c450a52a2
commit
5c8c09e021
@ -77,7 +77,7 @@ template<typename OtherDerived>
|
|||||||
Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
|
Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
|
||||||
::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
|
::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,OtherDerived::Dim,OtherDerived::Dim);
|
EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim));
|
||||||
*this = r.toRotationMatrix();
|
*this = r.toRotationMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&
|
|||||||
Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
|
Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
|
||||||
::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
|
::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,OtherDerived::Dim,OtherDerived::Dim);
|
EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim));
|
||||||
return *this = r.toRotationMatrix();
|
return *this = r.toRotationMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +188,9 @@ public:
|
|||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline Transform& prescale(const MatrixBase<OtherDerived> &other);
|
inline Transform& prescale(const MatrixBase<OtherDerived> &other);
|
||||||
|
|
||||||
|
inline Transform& scale(Scalar s);
|
||||||
|
inline Transform& prescale(Scalar s);
|
||||||
|
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline Transform& translate(const MatrixBase<OtherDerived> &other);
|
inline Transform& translate(const MatrixBase<OtherDerived> &other);
|
||||||
|
|
||||||
@ -310,6 +313,17 @@ Transform<Scalar,Dim>::scale(const MatrixBase<OtherDerived> &other)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Applies on the right a uniform scale of a factor \a c to \c *this
|
||||||
|
* and returns a reference to \c *this.
|
||||||
|
* \sa prescale(Scalar)
|
||||||
|
*/
|
||||||
|
template<typename Scalar, int Dim>
|
||||||
|
inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::scale(Scalar s)
|
||||||
|
{
|
||||||
|
linear() *= s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/** Applies on the left the non uniform scale transformation represented
|
/** Applies on the left the non uniform scale transformation represented
|
||||||
* by the vector \a other to \c *this and returns a reference to \c *this.
|
* by the vector \a other to \c *this and returns a reference to \c *this.
|
||||||
* \sa scale()
|
* \sa scale()
|
||||||
@ -324,6 +338,17 @@ Transform<Scalar,Dim>::prescale(const MatrixBase<OtherDerived> &other)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Applies on the left a uniform scale of a factor \a c to \c *this
|
||||||
|
* and returns a reference to \c *this.
|
||||||
|
* \sa scale(Scalar)
|
||||||
|
*/
|
||||||
|
template<typename Scalar, int Dim>
|
||||||
|
inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::prescale(Scalar s)
|
||||||
|
{
|
||||||
|
m_matrix.template corner<Dim,HDim>(TopLeft) *= s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/** Applies on the right the translation matrix represented by the vector \a other
|
/** Applies on the right the translation matrix represented by the vector \a other
|
||||||
* to \c *this and returns a reference to \c *this.
|
* to \c *this and returns a reference to \c *this.
|
||||||
* \sa pretranslate()
|
* \sa pretranslate()
|
||||||
@ -516,6 +541,7 @@ Transform<Scalar,Dim>::extractRotation(TransformTraits traits) const
|
|||||||
return linear();
|
return linear();
|
||||||
else
|
else
|
||||||
ei_assert("invalid traits value in Transform::inverse()");
|
ei_assert("invalid traits value in Transform::inverse()");
|
||||||
|
return LinearMatrixType();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Convenient method to set \c *this from a position, orientation and scale
|
/** Convenient method to set \c *this from a position, orientation and scale
|
||||||
|
@ -157,6 +157,16 @@ template<typename Scalar> void geometry(void)
|
|||||||
VERIFY_IS_APPROX(t1.matrix(), t0.matrix());
|
VERIFY_IS_APPROX(t1.matrix(), t0.matrix());
|
||||||
VERIFY_IS_APPROX(t1*v1, t0*v1);
|
VERIFY_IS_APPROX(t1*v1, t0*v1);
|
||||||
|
|
||||||
|
t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix());
|
||||||
|
t1.setIdentity(); t1.scale(v0).rotate(q1);
|
||||||
|
VERIFY_IS_APPROX(t0.matrix(), t1.matrix());
|
||||||
|
|
||||||
|
t0.setIdentity(); t0.scale(v0).rotate(AngleAxis(q1));
|
||||||
|
VERIFY_IS_APPROX(t0.matrix(), t1.matrix());
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(t0.scale(a).matrix(), t1.scale(Vector3::Constant(a)).matrix());
|
||||||
|
VERIFY_IS_APPROX(t0.prescale(a).matrix(), t1.prescale(Vector3::Constant(a)).matrix());
|
||||||
|
|
||||||
// 2D transformation
|
// 2D transformation
|
||||||
Transform2 t20, t21;
|
Transform2 t20, t21;
|
||||||
Vector2 v20 = test_random_matrix<Vector2>();
|
Vector2 v20 = test_random_matrix<Vector2>();
|
||||||
@ -173,14 +183,6 @@ template<typename Scalar> void geometry(void)
|
|||||||
VERIFY( (t20.fromPositionOrientationScale(v20,a,v21)
|
VERIFY( (t20.fromPositionOrientationScale(v20,a,v21)
|
||||||
* (t21.prescale(v21.cwise().inverse()).translate(-v20))).isIdentity(test_precision<Scalar>()) );
|
* (t21.prescale(v21.cwise().inverse()).translate(-v20))).isIdentity(test_precision<Scalar>()) );
|
||||||
|
|
||||||
|
|
||||||
t0.setIdentity(); t0.scale(v0).rotate(q1.toRotationMatrix());
|
|
||||||
t1.setIdentity(); t1.scale(v0).rotate(q1);
|
|
||||||
VERIFY_IS_APPROX(t0.matrix(), t1.matrix());
|
|
||||||
|
|
||||||
t0.setIdentity(); t0.scale(v0).rotate(AngleAxis(q1));
|
|
||||||
VERIFY_IS_APPROX(t0.matrix(), t1.matrix());
|
|
||||||
|
|
||||||
// Transform - new API
|
// Transform - new API
|
||||||
// 3D
|
// 3D
|
||||||
t0.setIdentity();
|
t0.setIdentity();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user