* Add Hyperplane::transform(Matrix/Transform)
* Fix compilations with gcc 3.4, ICC and doxygen * Fix krazy directives (hopefully)
This commit is contained in:
		
							parent
							
								
									5c34d8e20a
								
							
						
					
					
						commit
						7e8aa63bb7
					
				
							
								
								
									
										4
									
								
								.krazy
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								.krazy
									
									
									
									
									
								
							| @ -1 +1,3 @@ | ||||
| IGNORESUBS disabled,bench,build | ||||
| SKIP /disabled/ | ||||
| SKIP /bench/ | ||||
| SKIP /build/ | ||||
|  | ||||
| @ -234,7 +234,7 @@ MatrixBase<Derived>::Constant(const Scalar& value) | ||||
| 
 | ||||
| template<typename Derived> | ||||
| bool MatrixBase<Derived>::isApproxToConstant | ||||
| (const Scalar& value, typename NumTraits<Scalar>::Real prec) const | ||||
| (const Scalar& value, RealScalar prec) const | ||||
| { | ||||
|   for(int j = 0; j < cols(); j++) | ||||
|     for(int i = 0; i < rows(); i++) | ||||
| @ -328,7 +328,7 @@ MatrixBase<Derived>::Zero() | ||||
|   */ | ||||
| template<typename Derived> | ||||
| bool MatrixBase<Derived>::isZero | ||||
| (typename NumTraits<Scalar>::Real prec) const | ||||
| (RealScalar prec) const | ||||
| { | ||||
|   for(int j = 0; j < cols(); j++) | ||||
|     for(int i = 0; i < rows(); i++) | ||||
| @ -425,7 +425,7 @@ MatrixBase<Derived>::Ones() | ||||
|   */ | ||||
| template<typename Derived> | ||||
| bool MatrixBase<Derived>::isOnes | ||||
| (typename NumTraits<Scalar>::Real prec) const | ||||
| (RealScalar prec) const | ||||
| { | ||||
|   return isApproxToConstant(Scalar(1), prec); | ||||
| } | ||||
| @ -497,7 +497,7 @@ MatrixBase<Derived>::Identity() | ||||
|   */ | ||||
| template<typename Derived> | ||||
| bool MatrixBase<Derived>::isIdentity | ||||
| (typename NumTraits<Scalar>::Real prec) const | ||||
| (RealScalar prec) const | ||||
| { | ||||
|   for(int j = 0; j < cols(); j++) | ||||
|   { | ||||
|  | ||||
| @ -108,7 +108,7 @@ MatrixBase<Derived>::asDiagonal() const | ||||
|   */ | ||||
| template<typename Derived> | ||||
| bool MatrixBase<Derived>::isDiagonal | ||||
| (typename NumTraits<Scalar>::Real prec) const | ||||
| (RealScalar prec) const | ||||
| { | ||||
|   if(cols() != rows()) return false; | ||||
|   RealScalar maxAbsOnDiagonal = static_cast<RealScalar>(-1); | ||||
|  | ||||
| @ -177,8 +177,10 @@ struct ei_dot_impl<Derived1, Derived2, LinearVectorization, NoUnrolling> | ||||
|     const int size = v1.size(); | ||||
|     const int packetSize = ei_packet_traits<Scalar>::size; | ||||
|     const int alignedSize = (size/packetSize)*packetSize; | ||||
|     const int alignment1 = (Derived1::Flags & AlignedBit) ? Aligned : Unaligned; | ||||
|     const int alignment2 = (Derived2::Flags & AlignedBit) ? Aligned : Unaligned; | ||||
|     enum { | ||||
|       alignment1 = (Derived1::Flags & AlignedBit) ? Aligned : Unaligned, | ||||
|       alignment2 = (Derived2::Flags & AlignedBit) ? Aligned : Unaligned | ||||
|     }; | ||||
|     Scalar res; | ||||
| 
 | ||||
|     // do the vectorizable part of the sum
 | ||||
|  | ||||
| @ -195,8 +195,10 @@ struct ei_sum_impl<Derived, LinearVectorization, NoUnrolling> | ||||
|                            || !(Derived::Flags & DirectAccessBit) | ||||
|                            ? 0 | ||||
|                            : ei_alignmentOffset(&mat.const_cast_derived().coeffRef(0), size); | ||||
|     const int alignment = (Derived::Flags & DirectAccessBit) || (Derived::Flags & AlignedBit) | ||||
|                         ? Aligned : Unaligned; | ||||
|     enum { | ||||
|       alignment = (Derived::Flags & DirectAccessBit) || (Derived::Flags & AlignedBit) | ||||
|                 ? Aligned : Unaligned | ||||
|     }; | ||||
|     const int alignedSize = ((size-alignedStart)/packetSize)*packetSize; | ||||
|     const int alignedEnd = alignedStart + alignedSize; | ||||
|     Scalar res; | ||||
|  | ||||
| @ -28,7 +28,7 @@ | ||||
| 
 | ||||
| const int Dynamic = 10000; | ||||
| 
 | ||||
| /** \defgroup flags
 | ||||
| /** \defgroup flags flags
 | ||||
|   * \ingroup Core_Module | ||||
|   * | ||||
|   * These are the possible bits which can be OR'ed to constitute the flags of a matrix or | ||||
|  | ||||
| @ -60,9 +60,11 @@ template<typename _Scalar> | ||||
| class AngleAxis : public RotationBase<AngleAxis<_Scalar>,3> | ||||
| { | ||||
|   typedef RotationBase<AngleAxis<_Scalar>,3> Base; | ||||
|   using Base::operator*; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   using Base::operator*; | ||||
|    | ||||
|   enum { Dim = 3 }; | ||||
|   /** the scalar type of the coefficients */ | ||||
|   typedef _Scalar Scalar; | ||||
|  | ||||
| @ -48,7 +48,7 @@ class ParametrizedLine | ||||
| 
 | ||||
|     ParametrizedLine(const VectorType& origin, const VectorType& direction) | ||||
|       : m_origin(origin), m_direction(direction) {} | ||||
|     ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane); | ||||
|     explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane); | ||||
| 
 | ||||
|     ~ParametrizedLine() {} | ||||
| 
 | ||||
| @ -227,22 +227,41 @@ class Hyperplane | ||||
|                             invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2))); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
| #if 0    
 | ||||
|      | ||||
|     template<typename XprType> | ||||
|     inline Hyperplane operator* (const MatrixBase<XprType>& mat) const | ||||
|     { return Hyperplane(mat.inverse().transpose() * normal(), offset()); } | ||||
|     inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = GenericAffine) | ||||
|     { | ||||
|       if (traits==GenericAffine) | ||||
|         normal() = mat.inverse().transpose() * normal(); | ||||
|       else if (traits==NoShear) | ||||
|         normal() = (mat.colwise().norm2().cwise().inverse().eval().asDiagonal() | ||||
|                     * mat.transpose()).transpose() * normal(); | ||||
|       else if (traits==NoScaling) | ||||
|         normal() = mat * normal(); | ||||
|       else | ||||
|       { | ||||
|         ei_assert("invalid traits value in Hyperplane::transform()"); | ||||
|       } | ||||
|       return *this; | ||||
|     } | ||||
| 
 | ||||
|     template<typename XprType> | ||||
|     inline Hyperplane& operator*= (const MatrixBase<XprType>& mat) const | ||||
|     { normal() = mat.inverse().transpose() * normal(); return *this; } | ||||
| #endif | ||||
|     inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime>& t, | ||||
|                                  TransformTraits traits = GenericAffine) | ||||
|     { | ||||
|       transform(t.linear(), traits); | ||||
|       offset() -= t.translation().dot(normal()); | ||||
|       return *this; | ||||
|     } | ||||
| 
 | ||||
| protected: | ||||
| 
 | ||||
|     Coefficients m_coeffs; | ||||
| }; | ||||
| 
 | ||||
| /** Construct a parametrized line from a 2D hyperplane
 | ||||
|   * | ||||
|   * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line | ||||
|   */ | ||||
| template <typename _Scalar, int _AmbientDim> | ||||
| ParametrizedLine<_Scalar, _AmbientDim>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane) | ||||
| { | ||||
|  | ||||
| @ -61,12 +61,13 @@ template<typename _Scalar> | ||||
| class Quaternion : public RotationBase<Quaternion<_Scalar>,3> | ||||
| { | ||||
|   typedef RotationBase<Quaternion<_Scalar>,3> Base; | ||||
|   using Base::operator*; | ||||
|   typedef Matrix<_Scalar, 4, 1> Coefficients; | ||||
|   Coefficients m_coeffs; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   using Base::operator*; | ||||
| 
 | ||||
|   /** the scalar type of the coefficients */ | ||||
|   typedef _Scalar Scalar; | ||||
| 
 | ||||
|  | ||||
| @ -50,9 +50,11 @@ template<typename _Scalar> | ||||
| class Rotation2D : public RotationBase<Rotation2D<_Scalar>,2> | ||||
| { | ||||
|   typedef RotationBase<Rotation2D<_Scalar>,2> Base; | ||||
|   using Base::operator*; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   using Base::operator*; | ||||
| 
 | ||||
|   enum { Dim = 2 }; | ||||
|   /** the scalar type of the coefficients */ | ||||
|   typedef _Scalar Scalar; | ||||
|  | ||||
| @ -539,10 +539,11 @@ Transform<Scalar,Dim>::extractRotation(TransformTraits traits) const | ||||
|   } | ||||
|   else if (traits == NoScaling) // though that's stupid let's handle it !
 | ||||
|     return linear(); | ||||
|   else { | ||||
|   else | ||||
|   { | ||||
|     ei_assert("invalid traits value in Transform::inverse()"); | ||||
|     return LinearMatrixType(); | ||||
|   } | ||||
|   return LinearMatrixType(); | ||||
| } | ||||
| 
 | ||||
| /** Convenient method to set \c *this from a position, orientation and scale
 | ||||
|  | ||||
| @ -216,7 +216,7 @@ struct ei_compute_inverse<MatrixType, 4> | ||||
|   * \sa inverse() | ||||
|   */ | ||||
| template<typename Derived> | ||||
| inline void MatrixBase<Derived>::computeInverse(typename MatrixBase<Derived>::EvalType *result) const | ||||
| inline void MatrixBase<Derived>::computeInverse(EvalType *result) const | ||||
| { | ||||
|   typedef typename ei_eval<Derived>::type MatrixType; | ||||
|   ei_assert(rows() == cols()); | ||||
|  | ||||
| @ -637,42 +637,50 @@ mat2x2 = t.linear(); | ||||
| Eigen's geometry module offer two different ways to build and update transformation objects. | ||||
| <table class="tutorial_code"> | ||||
| <tr><td></td><td>\b procedurale \b API </td><td>\b natural \b API </td></tr> | ||||
| <tr><td>Applies a translation</td><td>\code | ||||
| t.translate(Vector3(tx, ty, ...)); | ||||
| t.pretranslate(Vector3(tx, ty, ...)); | ||||
| <tr><td>Translation</td><td>\code | ||||
| t.translate(Vector_(tx, ty, ...)); | ||||
| 
 | ||||
| t.pretranslate(Vector_(tx, ty, ...)); | ||||
| \endcode</td><td>\code | ||||
| t *= Translation(tx, ty, ...); | ||||
| t = Translation(tx, ty, ...) * t; | ||||
| t *= Translation_(tx, ty, ...); | ||||
| t2 = t1 * Translation_(vec); | ||||
| t = Translation_(tx, ty, ...) * t; | ||||
| \endcode</td></tr> | ||||
| <tr><td>Applies a rotation \n <span class="note">In 2D, any_rotation can also be \n an angle in radian</span></td><td>\code | ||||
| <tr><td>Rotation \n <span class="note">In 2D, any_rotation can also \n be an angle in radian</span></td><td>\code | ||||
| t.rotate(any_rotation); | ||||
| 
 | ||||
| t.prerotate(any_rotation); | ||||
| \endcode</td><td>\code | ||||
| t *= any_rotation; | ||||
| t2 = t1 * any_rotation; | ||||
| t = any_rotation * t; | ||||
| \endcode</td></tr> | ||||
| <tr><td>Applies a scaling</td><td>\code | ||||
| t.scale(Vector(sx, sy, ...)); | ||||
| t.scale(Vector::Constant(s)); | ||||
| t.prescale(Vector3f(sx, sy, ...)); | ||||
| <tr><td>Scaling</td><td>\code | ||||
| t.scale(Vector_(sx, sy, ...)); | ||||
| 
 | ||||
| t.scale(s); | ||||
| t.prescale(Vector_(sx, sy, ...)); | ||||
| t.prescale(s); | ||||
| \endcode</td><td>\code | ||||
| t *= Scaling(sx, sy, ...); | ||||
| t *= Scaling(s); | ||||
| t = Scaling(sx, sy, ...) * t; | ||||
| t *= Scaling_(sx, sy, ...); | ||||
| t2 = t1 * Scaling_(vec); | ||||
| t *= Scaling_(s); | ||||
| t = Scaling_(sx, sy, ...) * t; | ||||
| t = Scaling_(s) * t; | ||||
| \endcode</td></tr> | ||||
| <tr><td>Applies a shear transformation \n ( \b 2D \b only ! )</td><td>\code | ||||
| <tr><td>Shear transformation \n ( \b 2D \b only ! )</td><td>\code | ||||
| t.shear(sx,sy); | ||||
| t.preshear(sx,sy); | ||||
| \endcode</td><td></td></tr> | ||||
| </table> | ||||
| 
 | ||||
| Note that in both API, any many transformations can be concatenated in a single lines as shown in the two following equivalent examples: | ||||
| Note that in both API, any many transformations can be concatenated in a single expression as shown in the two following equivalent examples: | ||||
| <table class="tutorial_code"> | ||||
| <tr><td>\code | ||||
| t.pretranslate(..).rotate(..).translate(..).scale(..); | ||||
| \endcode</td></tr> | ||||
| <tr><td>\code | ||||
| t = Translation(..) * t * RotationType(..) * Translation(..) * Scaling(..); | ||||
| t = Translation_(..) * t * RotationType(..) * Translation_(..) * Scaling_(..); | ||||
| \endcode</td></tr> | ||||
| </table> | ||||
| 
 | ||||
|  | ||||
| @ -2,3 +2,4 @@ | ||||
| 
 | ||||
| sed -i 's/^.li.*MatrixBase\<.*gt.*a.$/ /g' $1 | ||||
| sed -i 's/^.li.*MapBase\<.*gt.*a.$/ /g' $1 | ||||
| sed -i 's/^.li.*RotationBase\<.*gt.*a.$/ /g' $1 | ||||
|  | ||||
							
								
								
									
										2
									
								
								doc/examples/.krazy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/examples/.krazy
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | ||||
| EXCLUDE copyright | ||||
| EXCLUDE license | ||||
| @ -1 +1,2 @@ | ||||
| EXCLUDE copyright,license | ||||
| EXCLUDE copyright | ||||
| EXCLUDE license | ||||
|  | ||||
| @ -284,6 +284,6 @@ void test_geometry() | ||||
| { | ||||
|   for(int i = 0; i < g_repeat; i++) { | ||||
|     CALL_SUBTEST( geometry<float>() ); | ||||
| //     CALL_SUBTEST( geometry<double>() );
 | ||||
|     CALL_SUBTEST( geometry<double>() ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -25,6 +25,7 @@ | ||||
| #include "main.h" | ||||
| #include <Eigen/Geometry> | ||||
| #include <Eigen/LU> | ||||
| #include <Eigen/QR> | ||||
| 
 | ||||
| template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane) | ||||
| { | ||||
| @ -36,6 +37,8 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane) | ||||
|   typedef typename HyperplaneType::Scalar Scalar; | ||||
|   typedef typename NumTraits<Scalar>::Real RealScalar; | ||||
|   typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime, 1> VectorType; | ||||
|   typedef Matrix<Scalar, HyperplaneType::AmbientDimAtCompileTime, | ||||
|                          HyperplaneType::AmbientDimAtCompileTime> MatrixType; | ||||
| 
 | ||||
|   VectorType p0 = VectorType::Random(dim); | ||||
|   VectorType p1 = VectorType::Random(dim); | ||||
| @ -45,6 +48,7 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane) | ||||
|    | ||||
|   HyperplaneType pl0(n0, p0); | ||||
|   HyperplaneType pl1(n1, p1); | ||||
|   HyperplaneType pl2 = pl1; | ||||
| 
 | ||||
|   Scalar s0 = ei_random<Scalar>(); | ||||
|   Scalar s1 = ei_random<Scalar>(); | ||||
| @ -56,6 +60,32 @@ template<typename HyperplaneType> void hyperplane(const HyperplaneType& _plane) | ||||
|   VERIFY_IS_APPROX( pl1.signedDistance(p1 + n1 * s0), s0 ); | ||||
|   VERIFY_IS_MUCH_SMALLER_THAN( pl1.signedDistance(pl1.projection(p0)), Scalar(1) ); | ||||
|   VERIFY_IS_MUCH_SMALLER_THAN( pl1.absDistance(p1 +  pl1.normal().unitOrthogonal() * s1), Scalar(1) ); | ||||
| 
 | ||||
|   // transform
 | ||||
|   if (!NumTraits<Scalar>::IsComplex) | ||||
|   { | ||||
|     MatrixType rot = MatrixType::Random(dim,dim).qr().matrixQ(); | ||||
|     Scaling<Scalar,HyperplaneType::AmbientDimAtCompileTime> scaling(VectorType::Random()); | ||||
|     Translation<Scalar,HyperplaneType::AmbientDimAtCompileTime> translation(VectorType::Random()); | ||||
|      | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot).absDistance(rot * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot,NoScaling).absDistance(rot * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling).absDistance((rot*scaling) * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling, NoShear).absDistance((rot*scaling) * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling*translation) | ||||
|                                  .absDistance((rot*scaling*translation) * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*scaling*translation,NoShear) | ||||
|                                  .absDistance((rot*scaling*translation) * p1), Scalar(1) ); | ||||
|     pl2 = pl1; | ||||
|     VERIFY_IS_MUCH_SMALLER_THAN( pl2.transform(rot*translation,NoScaling) | ||||
|                                  .absDistance((rot*translation) * p1), Scalar(1) ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| template<typename Scalar> void lines() | ||||
|  | ||||
| @ -54,7 +54,7 @@ namespace Eigen | ||||
|     static const bool should_raise_an_assert = false; | ||||
| 
 | ||||
|     // Used to avoid to raise two exceptions at a time in which
 | ||||
|     // case the exception is not properly catched.
 | ||||
|     // case the exception is not properly caught.
 | ||||
|     // This may happen when a second exceptions is raise in a destructor.
 | ||||
|     static bool no_more_assert = false; | ||||
| 
 | ||||
|  | ||||
| @ -100,9 +100,6 @@ template<typename Scalar> void packetmath() | ||||
|       ref[i] = data1[i+offset]; | ||||
| 
 | ||||
|     typedef Matrix<Scalar, PacketSize, 1> Vector; | ||||
|     std::cout << Vector(data1).transpose() << " | " << Vector(data1+PacketSize).transpose() << "\n"; | ||||
|     std::cout << " " << offset << " => " << Vector(ref).transpose() << " == " << Vector(data2).transpose() << "\n"; | ||||
| 
 | ||||
|     VERIFY(areApprox(ref, data2, PacketSize) && "ei_palign"); | ||||
|   } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gael Guennebaud
						Gael Guennebaud