mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Transformation methods added to ParametrizedLine class.
This commit is contained in:
parent
0e0d92d34b
commit
d60cca32e5
@ -104,7 +104,44 @@ public:
|
|||||||
template <int OtherOptions>
|
template <int OtherOptions>
|
||||||
EIGEN_DEVICE_FUNC VectorType intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
|
EIGEN_DEVICE_FUNC VectorType intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
|
||||||
|
|
||||||
/** \returns \c *this with scalar type casted to \a NewScalarType
|
/** Applies the transformation matrix \a mat to \c *this and returns a reference to \c *this.
|
||||||
|
*
|
||||||
|
* \param mat the Dim x Dim transformation matrix
|
||||||
|
* \param traits specifies whether the matrix \a mat represents an #Isometry
|
||||||
|
* or a more generic #Affine transformation. The default is #Affine.
|
||||||
|
*/
|
||||||
|
template<typename XprType>
|
||||||
|
EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)
|
||||||
|
{
|
||||||
|
if (traits==Affine)
|
||||||
|
direction() = (mat * direction()).normalized();
|
||||||
|
else if (traits==Isometry)
|
||||||
|
direction() = mat * direction();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eigen_assert(0 && "invalid traits value in ParametrizedLine::transform()");
|
||||||
|
}
|
||||||
|
origin() = mat * origin();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Applies the transformation \a t to \c *this and returns a reference to \c *this.
|
||||||
|
*
|
||||||
|
* \param t the transformation of dimension Dim
|
||||||
|
* \param traits specifies whether the transformation \a t represents an #Isometry
|
||||||
|
* or a more generic #Affine transformation. The default is #Affine.
|
||||||
|
* Other kind of transformations are not supported.
|
||||||
|
*/
|
||||||
|
template<int TrOptions>
|
||||||
|
EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(const Transform<Scalar,AmbientDimAtCompileTime,Affine,TrOptions>& t,
|
||||||
|
TransformTraits traits = Affine)
|
||||||
|
{
|
||||||
|
transform(t.linear(), traits);
|
||||||
|
origin() += t.translation();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns \c *this with scalar type casted to \a NewScalarType
|
||||||
*
|
*
|
||||||
* Note that if \a NewScalarType is equal to the current scalar type of \c *this
|
* Note that if \a NewScalarType is equal to the current scalar type of \c *this
|
||||||
* then this function smartly returns a const reference to \c *this.
|
* then this function smartly returns a const reference to \c *this.
|
||||||
|
@ -25,6 +25,8 @@ template<typename LineType> void parametrizedline(const LineType& _line)
|
|||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType;
|
typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType;
|
||||||
typedef Hyperplane<Scalar,LineType::AmbientDimAtCompileTime> HyperplaneType;
|
typedef Hyperplane<Scalar,LineType::AmbientDimAtCompileTime> HyperplaneType;
|
||||||
|
typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime,
|
||||||
|
HyperplaneType::AmbientDimAtCompileTime> MatrixType;
|
||||||
|
|
||||||
VectorType p0 = VectorType::Random(dim);
|
VectorType p0 = VectorType::Random(dim);
|
||||||
VectorType p1 = VectorType::Random(dim);
|
VectorType p1 = VectorType::Random(dim);
|
||||||
@ -59,6 +61,31 @@ template<typename LineType> void parametrizedline(const LineType& _line)
|
|||||||
VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1));
|
VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1));
|
||||||
VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1));
|
VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1));
|
||||||
VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi);
|
VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi);
|
||||||
|
|
||||||
|
// transform
|
||||||
|
if (!NumTraits<Scalar>::IsComplex)
|
||||||
|
{
|
||||||
|
MatrixType rot = MatrixType::Random(dim,dim).householderQr().householderQ();
|
||||||
|
DiagonalMatrix<Scalar,LineType::AmbientDimAtCompileTime> scaling(VectorType::Random());
|
||||||
|
Translation<Scalar,LineType::AmbientDimAtCompileTime> translation(VectorType::Random());
|
||||||
|
|
||||||
|
while(scaling.diagonal().cwiseAbs().minCoeff()<RealScalar(1e-4)) scaling.diagonal() = VectorType::Random();
|
||||||
|
|
||||||
|
LineType l1 = l0;
|
||||||
|
VectorType p3 = l0.pointAt(Scalar(1));
|
||||||
|
VERIFY_IS_MUCH_SMALLER_THAN( l1.transform(rot).distance(rot * p3), Scalar(1) );
|
||||||
|
l1 = l0;
|
||||||
|
VERIFY_IS_MUCH_SMALLER_THAN( l1.transform(rot,Isometry).distance(rot * p3), Scalar(1) );
|
||||||
|
l1 = l0;
|
||||||
|
VERIFY_IS_MUCH_SMALLER_THAN( l1.transform(rot*scaling).distance((rot*scaling) * p3), Scalar(1) );
|
||||||
|
l1 = l0;
|
||||||
|
VERIFY_IS_MUCH_SMALLER_THAN( l1.transform(rot*scaling*translation)
|
||||||
|
.distance((rot*scaling*translation) * p3), Scalar(1) );
|
||||||
|
l1 = l0;
|
||||||
|
VERIFY_IS_MUCH_SMALLER_THAN( l1.transform(rot*translation,Isometry)
|
||||||
|
.distance((rot*translation) * p3), Scalar(1) );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Scalar> void parametrizedline_alignment()
|
template<typename Scalar> void parametrizedline_alignment()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user