mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-26 06:44:27 +08:00
Fix alignedbox 32-bit precision test failure.
The current `test/geo_alignedbox` tests fail on 32-bit arm due to small floating-point errors. In particular, the following is not guaranteed to hold: ``` IsometryTransform identity = IsometryTransform::Identity(); BoxType transformedC; transformedC.extend(c.transformed(identity)); VERIFY(transformedC.contains(c)); ``` since `c.transformed(identity)` is ever-so-slightly different from `c`. Instead, we replace this test with one that checks an identity transform is within floating-point precision of `c`. Also updated the condition on `AlignedBox::transform(...)` to only accept `Affine`, `AffineCompact`, and `Isometry` modes explicitly. Otherwise, invalid combinations of modes would also incorrectly pass the assertion.
This commit is contained in:
parent
30960d485e
commit
d5a0d89491
@ -46,7 +46,7 @@
|
|||||||
#ifndef EIGEN_ALIGNEDBOX_H
|
#ifndef EIGEN_ALIGNEDBOX_H
|
||||||
#define EIGEN_ALIGNEDBOX_H
|
#define EIGEN_ALIGNEDBOX_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
/** \geometry_module \ingroup Geometry_Module
|
/** \geometry_module \ingroup Geometry_Module
|
||||||
*
|
*
|
||||||
@ -267,7 +267,7 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
|
|||||||
{return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max)); }
|
{return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max)); }
|
||||||
|
|
||||||
/** Returns an AlignedBox that is the union of \a b and \c *this.
|
/** Returns an AlignedBox that is the union of \a b and \c *this.
|
||||||
* \note Merging with an empty box may result in a box bigger than \c *this.
|
* \note Merging with an empty box may result in a box bigger than \c *this.
|
||||||
* \sa extend(const AlignedBox&) */
|
* \sa extend(const AlignedBox&) */
|
||||||
EIGEN_DEVICE_FUNC inline AlignedBox merged(const AlignedBox& b) const
|
EIGEN_DEVICE_FUNC inline AlignedBox merged(const AlignedBox& b) const
|
||||||
{ return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max)); }
|
{ return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max)); }
|
||||||
@ -338,8 +338,8 @@ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
|
|||||||
template<int Mode, int Options>
|
template<int Mode, int Options>
|
||||||
EIGEN_DEVICE_FUNC inline void transform(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform)
|
EIGEN_DEVICE_FUNC inline void transform(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform)
|
||||||
{
|
{
|
||||||
// Projective transform is not (yet) supported
|
// Only Affine and Isometry transforms are currently supported.
|
||||||
EIGEN_STATIC_ASSERT(Mode != Projective, THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS);
|
EIGEN_STATIC_ASSERT(Mode == Affine || Mode == AffineCompact || Mode == Isometry, THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS);
|
||||||
|
|
||||||
// Method adapted from FCL src/shape/geometric_shapes_utility.cpp#computeBV<AABB, Box>(...)
|
// Method adapted from FCL src/shape/geometric_shapes_utility.cpp#computeBV<AABB, Box>(...)
|
||||||
// https://github.com/flexible-collision-library/fcl/blob/fcl-0.4/src/shape/geometric_shapes_utility.cpp#L292
|
// https://github.com/flexible-collision-library/fcl/blob/fcl-0.4/src/shape/geometric_shapes_utility.cpp#L292
|
||||||
|
@ -47,7 +47,7 @@ template<typename BoxType> void alignedbox(const BoxType& _box)
|
|||||||
BoxType b0(dim);
|
BoxType b0(dim);
|
||||||
BoxType b1(VectorType::Random(dim),VectorType::Random(dim));
|
BoxType b1(VectorType::Random(dim),VectorType::Random(dim));
|
||||||
BoxType b2;
|
BoxType b2;
|
||||||
|
|
||||||
kill_extra_precision(b1);
|
kill_extra_precision(b1);
|
||||||
kill_extra_precision(p0);
|
kill_extra_precision(p0);
|
||||||
kill_extra_precision(p1);
|
kill_extra_precision(p1);
|
||||||
@ -69,7 +69,7 @@ template<typename BoxType> void alignedbox(const BoxType& _box)
|
|||||||
BoxType box2(VectorType::Random(dim));
|
BoxType box2(VectorType::Random(dim));
|
||||||
box2.extend(VectorType::Random(dim));
|
box2.extend(VectorType::Random(dim));
|
||||||
|
|
||||||
VERIFY(box1.intersects(box2) == !box1.intersection(box2).isEmpty());
|
VERIFY(box1.intersects(box2) == !box1.intersection(box2).isEmpty());
|
||||||
|
|
||||||
// alignment -- make sure there is no memory alignment assertion
|
// alignment -- make sure there is no memory alignment assertion
|
||||||
BoxType *bp0 = new BoxType(dim);
|
BoxType *bp0 = new BoxType(dim);
|
||||||
@ -150,11 +150,9 @@ template<typename BoxType> void alignedboxTranslatable(const BoxType& _box)
|
|||||||
VERIFY_IS_APPROX((c.min)(), UnitX * Scalar(9));
|
VERIFY_IS_APPROX((c.min)(), UnitX * Scalar(9));
|
||||||
VERIFY_IS_APPROX((c.max)(), Ones * Scalar(18) + UnitX * Scalar(9));
|
VERIFY_IS_APPROX((c.max)(), Ones * Scalar(18) + UnitX * Scalar(9));
|
||||||
|
|
||||||
// test for roundoff errors
|
// Check identity transform within numerical precision.
|
||||||
IsometryTransform identity = IsometryTransform::Identity();
|
BoxType transformedC = c.transformed(IsometryTransform::Identity());
|
||||||
BoxType transformedC;
|
VERIFY_IS_APPROX(transformedC, c);
|
||||||
transformedC.extend(c.transformed(identity));
|
|
||||||
VERIFY(transformedC.contains(c));
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 10; ++i)
|
for (size_t i = 0; i < 10; ++i)
|
||||||
{
|
{
|
||||||
@ -335,10 +333,6 @@ template<typename BoxType, typename Rotation> void alignedboxNonIntegralRotatabl
|
|||||||
const Index dim = _box.dim();
|
const Index dim = _box.dim();
|
||||||
const VectorType Zero = VectorType::Zero();
|
const VectorType Zero = VectorType::Zero();
|
||||||
const VectorType Ones = VectorType::Ones();
|
const VectorType Ones = VectorType::Ones();
|
||||||
const VectorType UnitX = VectorType::UnitX();
|
|
||||||
const VectorType UnitY = VectorType::UnitY();
|
|
||||||
// this is vector (0, 0, -1, -1, -1, ...), i.e. with zeros at first and second dimensions
|
|
||||||
const VectorType UnitZ = Ones - UnitX - UnitY;
|
|
||||||
|
|
||||||
VectorType minPoint = -2 * Ones;
|
VectorType minPoint = -2 * Ones;
|
||||||
minPoint[1] = 1;
|
minPoint[1] = 1;
|
||||||
@ -365,7 +359,7 @@ template<typename BoxType, typename Rotation> void alignedboxNonIntegralRotatabl
|
|||||||
cornerBR = tf2 * cornerBR;
|
cornerBR = tf2 * cornerBR;
|
||||||
cornerTL = tf2 * cornerTL;
|
cornerTL = tf2 * cornerTL;
|
||||||
cornerTR = tf2 * cornerTR;
|
cornerTR = tf2 * cornerTR;
|
||||||
|
|
||||||
VectorType minCorner = Ones * Scalar(-2);
|
VectorType minCorner = Ones * Scalar(-2);
|
||||||
VectorType maxCorner = Zero;
|
VectorType maxCorner = Zero;
|
||||||
minCorner[0] = (min)((min)(cornerBL[0], cornerBR[0]), (min)(cornerTL[0], cornerTR[0]));
|
minCorner[0] = (min)((min)(cornerBL[0], cornerBR[0]), (min)(cornerTL[0], cornerTR[0]));
|
||||||
@ -471,7 +465,7 @@ template<typename BoxType, typename Rotation> void alignedboxNonIntegralRotatabl
|
|||||||
template<typename BoxType>
|
template<typename BoxType>
|
||||||
void alignedboxCastTests(const BoxType& _box)
|
void alignedboxCastTests(const BoxType& _box)
|
||||||
{
|
{
|
||||||
// casting
|
// casting
|
||||||
typedef typename BoxType::Scalar Scalar;
|
typedef typename BoxType::Scalar Scalar;
|
||||||
typedef Matrix<Scalar, BoxType::AmbientDimAtCompileTime, 1> VectorType;
|
typedef Matrix<Scalar, BoxType::AmbientDimAtCompileTime, 1> VectorType;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user