| // This file is part of Eigen, a lightweight C++ template library | 
 | // for linear algebra. | 
 | // | 
 | // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> | 
 | // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com> | 
 | // | 
 | // Eigen is free software; you can redistribute it and/or | 
 | // modify it under the terms of the GNU Lesser General Public | 
 | // License as published by the Free Software Foundation; either | 
 | // version 3 of the License, or (at your option) any later version. | 
 | // | 
 | // Alternatively, you can redistribute it and/or | 
 | // modify it under the terms of the GNU General Public License as | 
 | // published by the Free Software Foundation; either version 2 of | 
 | // the License, or (at your option) any later version. | 
 | // | 
 | // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY | 
 | // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | 
 | // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the | 
 | // GNU General Public License for more details. | 
 | // | 
 | // You should have received a copy of the GNU Lesser General Public | 
 | // License and a copy of the GNU General Public License along with | 
 | // Eigen. If not, see <http://www.gnu.org/licenses/>. | 
 |  | 
 | #include "main.h" | 
 | #include <Eigen/Geometry> | 
 | #include <Eigen/LU> | 
 | #include <Eigen/QR> | 
 |  | 
 | template<typename LineType> void parametrizedline(const LineType& _line) | 
 | { | 
 |   /* this test covers the following files: | 
 |      ParametrizedLine.h | 
 |   */ | 
 |   typedef typename LineType::Index Index; | 
 |   const Index dim = _line.dim(); | 
 |   typedef typename LineType::Scalar Scalar; | 
 |   typedef typename NumTraits<Scalar>::Real RealScalar; | 
 |   typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, 1> VectorType; | 
 |   typedef Matrix<Scalar, LineType::AmbientDimAtCompileTime, | 
 |                          LineType::AmbientDimAtCompileTime> MatrixType; | 
 |  | 
 |   VectorType p0 = VectorType::Random(dim); | 
 |   VectorType p1 = VectorType::Random(dim); | 
 |  | 
 |   VectorType d0 = VectorType::Random(dim).normalized(); | 
 |  | 
 |   LineType l0(p0, d0); | 
 |  | 
 |   Scalar s0 = ei_random<Scalar>(); | 
 |   Scalar s1 = ei_abs(ei_random<Scalar>()); | 
 |  | 
 |   VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0), RealScalar(1) ); | 
 |   VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(p0+s0*d0), RealScalar(1) ); | 
 |   VERIFY_IS_APPROX( (l0.projection(p1)-p1).norm(), l0.distance(p1) ); | 
 |   VERIFY_IS_MUCH_SMALLER_THAN( l0.distance(l0.projection(p1)), RealScalar(1) ); | 
 |   VERIFY_IS_APPROX( Scalar(l0.distance((p0+s0*d0) + d0.unitOrthogonal() * s1)), s1 ); | 
 |  | 
 |   // casting | 
 |   const int Dim = LineType::AmbientDimAtCompileTime; | 
 |   typedef typename GetDifferentType<Scalar>::type OtherScalar; | 
 |   ParametrizedLine<OtherScalar,Dim> hp1f = l0.template cast<OtherScalar>(); | 
 |   VERIFY_IS_APPROX(hp1f.template cast<Scalar>(),l0); | 
 |   ParametrizedLine<Scalar,Dim> hp1d = l0.template cast<Scalar>(); | 
 |   VERIFY_IS_APPROX(hp1d.template cast<Scalar>(),l0); | 
 | } | 
 |  | 
 | 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_4( parametrizedline(ParametrizedLine<std::complex<double>,5>()) ); | 
 |   } | 
 | } |