aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/util/ForwardDeclarations.h4
-rw-r--r--Eigen/src/Geometry/Hyperplane.h25
-rw-r--r--Eigen/src/Geometry/ParametrizedLine.h38
-rw-r--r--test/geo_hyperplane.cpp34
-rw-r--r--test/geo_parametrizedline.cpp30
-rw-r--r--test/geo_transformations.cpp10
6 files changed, 111 insertions, 30 deletions
diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h
index 3c5f91533..e873f15cb 100644
--- a/Eigen/src/Core/util/ForwardDeclarations.h
+++ b/Eigen/src/Core/util/ForwardDeclarations.h
@@ -247,8 +247,8 @@ template<typename Scalar,int Dim> class Scaling;
#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
template<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;
-template <typename _Scalar, int _AmbientDim> class ParametrizedLine;
-template <typename _Scalar, int _AmbientDim> class Hyperplane;
+template <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;
+template <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;
template<typename Scalar> class UniformScaling;
template<typename MatrixType,int Direction> class Homogeneous;
#endif
diff --git a/Eigen/src/Geometry/Hyperplane.h b/Eigen/src/Geometry/Hyperplane.h
index f22b23a24..e43c9d07d 100644
--- a/Eigen/src/Geometry/Hyperplane.h
+++ b/Eigen/src/Geometry/Hyperplane.h
@@ -43,24 +43,32 @@
* \f$ n \cdot x + d = 0 \f$ where \f$ n \f$ is a unit normal vector of the plane (linear part)
* and \f$ d \f$ is the distance (offset) to the origin.
*/
-template <typename _Scalar, int _AmbientDim>
+template <typename _Scalar, int _AmbientDim, int _Options>
class Hyperplane
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)
- enum { AmbientDimAtCompileTime = _AmbientDim };
+ enum {
+ AmbientDimAtCompileTime = _AmbientDim,
+ Options = _Options
+ };
typedef _Scalar Scalar;
typedef typename NumTraits<Scalar>::Real RealScalar;
typedef DenseIndex Index;
typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
typedef Matrix<Scalar,Index(AmbientDimAtCompileTime)==Dynamic
? Dynamic
- : Index(AmbientDimAtCompileTime)+1,1> Coefficients;
+ : Index(AmbientDimAtCompileTime)+1,1,Options> Coefficients;
typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;
typedef const Block<const Coefficients,AmbientDimAtCompileTime,1> ConstNormalReturnType;
/** Default constructor without initialization */
inline explicit Hyperplane() {}
+
+ template<int OtherOptions>
+ Hyperplane(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
+ : m_coeffs(other.coeffs())
+ {}
/** Constructs a dynamic-size hyperplane with \a _dim the dimension
* of the ambient space */
@@ -245,22 +253,23 @@ public:
*/
template<typename NewScalarType>
inline typename internal::cast_return_type<Hyperplane,
- Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+ Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
{
return typename internal::cast_return_type<Hyperplane,
- Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+ Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
}
/** Copy constructor with scalar type conversion */
- template<typename OtherScalarType>
- inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime>& other)
+ template<typename OtherScalarType,int OtherOptions>
+ inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
{ m_coeffs = other.coeffs().template cast<Scalar>(); }
/** \returns \c true if \c *this is approximately equal to \a other, within the precision
* determined by \a prec.
*
* \sa MatrixBase::isApprox() */
- bool isApprox(const Hyperplane& other, typename NumTraits<Scalar>::Real prec = NumTraits<Scalar>::dummy_precision()) const
+ template<int OtherOptions>
+ bool isApprox(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other, typename NumTraits<Scalar>::Real prec = NumTraits<Scalar>::dummy_precision()) const
{ return m_coeffs.isApprox(other.m_coeffs, prec); }
protected:
diff --git a/Eigen/src/Geometry/ParametrizedLine.h b/Eigen/src/Geometry/ParametrizedLine.h
index 858cdf6a8..edad5f8ee 100644
--- a/Eigen/src/Geometry/ParametrizedLine.h
+++ b/Eigen/src/Geometry/ParametrizedLine.h
@@ -39,19 +39,27 @@
* \param _Scalar the scalar type, i.e., the type of the coefficients
* \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
*/
-template <typename _Scalar, int _AmbientDim>
+template <typename _Scalar, int _AmbientDim, int _Options>
class ParametrizedLine
{
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
- enum { AmbientDimAtCompileTime = _AmbientDim };
+ enum {
+ AmbientDimAtCompileTime = _AmbientDim,
+ Options = _Options
+ };
typedef _Scalar Scalar;
typedef typename NumTraits<Scalar>::Real RealScalar;
typedef DenseIndex Index;
- typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
+ typedef Matrix<Scalar,AmbientDimAtCompileTime,1,Options> VectorType;
/** Default constructor without initialization */
inline explicit ParametrizedLine() {}
+
+ template<int OtherOptions>
+ ParametrizedLine(const ParametrizedLine<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
+ : m_origin(other.origin()), m_direction(other.direction())
+ {}
/** Constructs a dynamic-size line with \a _dim the dimension
* of the ambient space */
@@ -63,7 +71,8 @@ public:
ParametrizedLine(const VectorType& origin, const VectorType& direction)
: m_origin(origin), m_direction(direction) {}
- explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);
+ template <int OtherOptions>
+ explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane);
/** Constructs a parametrized line going from \a p0 to \a p1. */
static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)
@@ -97,7 +106,8 @@ public:
VectorType projection(const VectorType& p) const
{ return origin() + direction().dot(p-origin()) * direction(); }
- Scalar intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);
+ template <int OtherOptions>
+ Scalar intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane);
/** \returns \c *this with scalar type casted to \a NewScalarType
*
@@ -106,15 +116,15 @@ public:
*/
template<typename NewScalarType>
inline typename internal::cast_return_type<ParametrizedLine,
- ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+ ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
{
return typename internal::cast_return_type<ParametrizedLine,
- ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+ ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
}
/** Copy constructor with scalar type conversion */
- template<typename OtherScalarType>
- inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime>& other)
+ template<typename OtherScalarType,int OtherOptions>
+ inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
{
m_origin = other.origin().template cast<Scalar>();
m_direction = other.direction().template cast<Scalar>();
@@ -136,8 +146,9 @@ protected:
*
* \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
*/
-template <typename _Scalar, int _AmbientDim>
-inline ParametrizedLine<_Scalar, _AmbientDim>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline ParametrizedLine<_Scalar, _AmbientDim,_Options>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim,OtherOptions>& hyperplane)
{
EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
direction() = hyperplane.normal().unitOrthogonal();
@@ -146,8 +157,9 @@ inline ParametrizedLine<_Scalar, _AmbientDim>::ParametrizedLine(const Hyperplane
/** \returns the parameter value of the intersection between \c *this and the given hyperplane
*/
-template <typename _Scalar, int _AmbientDim>
-inline _Scalar ParametrizedLine<_Scalar, _AmbientDim>::intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane)
{
return -(hyperplane.offset()+hyperplane.normal().dot(origin()))
/ hyperplane.normal().dot(direction());
diff --git a/test/geo_hyperplane.cpp b/test/geo_hyperplane.cpp
index 23027f38e..de3c6df0b 100644
--- a/test/geo_hyperplane.cpp
+++ b/test/geo_hyperplane.cpp
@@ -35,6 +35,7 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane)
*/
typedef typename HyperplaneType::Index Index;
const Index dim = _plane.dim();
+ enum { Options = HyperplaneType::Options };
typedef typename HyperplaneType::Scalar Scalar;
typedef typename NumTraits<Scalar>::Real RealScalar;
typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime, 1> VectorType;
@@ -85,9 +86,9 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane)
// casting
const int Dim = HyperplaneType::AmbientDimAtCompileTime;
typedef typename GetDifferentType<Scalar>::type OtherScalar;
- Hyperplane<OtherScalar,Dim> hp1f = pl1.template cast<OtherScalar>();
+ Hyperplane<OtherScalar,Dim,Options> hp1f = pl1.template cast<OtherScalar>();
VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),pl1);
- Hyperplane<Scalar,Dim> hp1d = pl1.template cast<Scalar>();
+ Hyperplane<Scalar,Dim,Options> hp1d = pl1.template cast<Scalar>();
VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),pl1);
}
@@ -128,11 +129,40 @@ template<typename Scalar> void lines()
}
}
+template<typename Scalar> void hyperplane_alignment()
+{
+ typedef Hyperplane<Scalar,3,AutoAlign> Plane3a;
+ typedef Hyperplane<Scalar,3,DontAlign> Plane3u;
+
+ EIGEN_ALIGN16 Scalar array1[4];
+ EIGEN_ALIGN16 Scalar array2[4];
+ EIGEN_ALIGN16 Scalar array3[4+1];
+ Scalar* array3u = array3+1;
+
+ Plane3a *p1 = ::new(reinterpret_cast<void*>(array1)) Plane3a;
+ Plane3u *p2 = ::new(reinterpret_cast<void*>(array2)) Plane3u;
+ Plane3u *p3 = ::new(reinterpret_cast<void*>(array3u)) Plane3u;
+
+ p1->coeffs().setRandom();
+ *p2 = *p1;
+ *p3 = *p1;
+
+ VERIFY_IS_APPROX(p1->coeffs(), p2->coeffs());
+ VERIFY_IS_APPROX(p1->coeffs(), p3->coeffs());
+
+ #ifdef EIGEN_VECTORIZE
+ VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(array3u)) Plane3a));
+ #endif
+}
+
+
void test_geo_hyperplane()
{
for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( hyperplane(Hyperplane<float,2>()) );
CALL_SUBTEST_2( hyperplane(Hyperplane<float,3>()) );
+ CALL_SUBTEST_2( hyperplane(Hyperplane<float,3,DontAlign>()) );
+ CALL_SUBTEST_2( hyperplane_alignment<float>() );
CALL_SUBTEST_3( hyperplane(Hyperplane<double,4>()) );
CALL_SUBTEST_4( hyperplane(Hyperplane<std::complex<double>,5>()) );
CALL_SUBTEST_1( lines<float>() );
diff --git a/test/geo_parametrizedline.cpp b/test/geo_parametrizedline.cpp
index 36b38b979..460455eec 100644
--- a/test/geo_parametrizedline.cpp
+++ b/test/geo_parametrizedline.cpp
@@ -66,12 +66,42 @@ template<typename LineType> void parametrizedline(const LineType& _line)
VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),l0);
}
+template<typename Scalar> void parametrizedline_alignment()
+{
+ typedef ParametrizedLine<Scalar,4,AutoAlign> Line4a;
+ typedef ParametrizedLine<Scalar,4,DontAlign> Line4u;
+
+ EIGEN_ALIGN16 Scalar array1[8];
+ EIGEN_ALIGN16 Scalar array2[8];
+ EIGEN_ALIGN16 Scalar array3[8+1];
+ Scalar* array3u = array3+1;
+
+ Line4a *p1 = ::new(reinterpret_cast<void*>(array1)) Line4a;
+ Line4u *p2 = ::new(reinterpret_cast<void*>(array2)) Line4u;
+ Line4u *p3 = ::new(reinterpret_cast<void*>(array3u)) Line4u;
+
+ p1->origin().setRandom();
+ p1->direction().setRandom();
+ *p2 = *p1;
+ *p3 = *p1;
+
+ VERIFY_IS_APPROX(p1->origin(), p2->origin());
+ VERIFY_IS_APPROX(p1->origin(), p3->origin());
+ VERIFY_IS_APPROX(p1->direction(), p2->direction());
+ VERIFY_IS_APPROX(p1->direction(), p3->direction());
+
+ #ifdef EIGEN_VECTORIZE
+ VERIFY_RAISES_ASSERT((::new(reinterpret_cast<void*>(array3u)) Line4a));
+ #endif
+}
+
void test_geo_parametrizedline()
{
for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( parametrizedline(ParametrizedLine<float,2>()) );
CALL_SUBTEST_2( parametrizedline(ParametrizedLine<float,3>()) );
CALL_SUBTEST_3( parametrizedline(ParametrizedLine<double,4>()) );
+ CALL_SUBTEST_3( parametrizedline_alignment<double>() );
CALL_SUBTEST_4( parametrizedline(ParametrizedLine<std::complex<double>,5>()) );
}
}
diff --git a/test/geo_transformations.cpp b/test/geo_transformations.cpp
index 317ed9a31..13305ddc8 100644
--- a/test/geo_transformations.cpp
+++ b/test/geo_transformations.cpp
@@ -429,17 +429,17 @@ template<typename Scalar, int Mode, int Options> void transformations()
template<typename Scalar> void transform_alignment()
{
- typedef Transform<Scalar,3,Projective,AutoAlign> Projective4a;
- typedef Transform<Scalar,3,Projective,DontAlign> Projective4u;
+ typedef Transform<Scalar,3,Projective,AutoAlign> Projective3a;
+ typedef Transform<Scalar,3,Projective,DontAlign> Projective3u;
EIGEN_ALIGN16 Scalar array1[16];
EIGEN_ALIGN16 Scalar array2[16];
EIGEN_ALIGN16 Scalar array3[16+1];
Scalar* array3u = array3+1;
- Projective4a *p1 = ::new(reinterpret_cast<void*>(array1)) Projective4a;
- Projective4u *p2 = ::new(reinterpret_cast<void*>(array2)) Projective4u;
- Projective4u *p3 = ::new(reinterpret_cast<void*>(array3u)) Projective4u;
+ Projective3a *p1 = ::new(reinterpret_cast<void*>(array1)) Projective3a;
+ Projective3u *p2 = ::new(reinterpret_cast<void*>(array2)) Projective3u;
+ Projective3u *p3 = ::new(reinterpret_cast<void*>(array3u)) Projective3u;
p1->matrix().setRandom();
*p2 = *p1;