geo_parametrizedline.cpp File Reference
#include "main.h"
#include <Eigen/Geometry>
#include <Eigen/LU>
#include <Eigen/QR>

Functions

template<typename LineType >
void parametrizedline (const LineType &_line)
 
template<typename Scalar >
void parametrizedline_alignment ()
 
 EIGEN_DECLARE_TEST (geo_parametrizedline)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( geo_parametrizedline  )
112  {
113  for (int i = 0; i < g_repeat; i++) {
116  CALL_SUBTEST_2(parametrizedline_alignment<float>());
118  CALL_SUBTEST_3(parametrizedline_alignment<double>());
119  CALL_SUBTEST_4(parametrizedline(ParametrizedLine<std::complex<double>, 5>()));
120  }
121 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
A parametrized line.
Definition: ParametrizedLine.h:33
void parametrizedline(const LineType &_line)
Definition: geo_parametrizedline.cpp:17
static int g_repeat
Definition: main.h:191
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22

References CALL_SUBTEST_1, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, Eigen::g_repeat, i, and parametrizedline().

◆ parametrizedline()

template<typename LineType >
void parametrizedline ( const LineType &  _line)
17  {
18  /* this test covers the following files:
19  ParametrizedLine.h
20  */
21  using std::abs;
22  const Index dim = _line.dim();
23  typedef typename LineType::Scalar Scalar;
24  typedef typename NumTraits<Scalar>::Real RealScalar;
28 
29  VectorType p0 = VectorType::Random(dim);
30  VectorType p1 = VectorType::Random(dim);
31 
32  VectorType d0 = VectorType::Random(dim).normalized();
33 
34  LineType l0(p0, d0);
35 
36  Scalar s0 = internal::random<Scalar>();
37  Scalar s1 = abs(internal::random<Scalar>());
38 
39  VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(p0), RealScalar(1));
40  VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(p0 + s0 * d0), RealScalar(1));
41  VERIFY_IS_APPROX((l0.projection(p1) - p1).norm(), l0.distance(p1));
42  VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(l0.projection(p1)), RealScalar(1));
43  VERIFY_IS_APPROX(Scalar(l0.distance((p0 + s0 * d0) + d0.unitOrthogonal() * s1)), s1);
44 
45  // casting
46  const int Dim = LineType::AmbientDimAtCompileTime;
47  typedef typename GetDifferentType<Scalar>::type OtherScalar;
48  ParametrizedLine<OtherScalar, Dim> hp1f = l0.template cast<OtherScalar>();
49  VERIFY_IS_APPROX(hp1f.template cast<Scalar>(), l0);
50  ParametrizedLine<Scalar, Dim> hp1d = l0.template cast<Scalar>();
51  VERIFY_IS_APPROX(hp1d.template cast<Scalar>(), l0);
52 
53  // intersections
54  VectorType p2 = VectorType::Random(dim);
55  VectorType n2 = VectorType::Random(dim).normalized();
56  HyperplaneType hp(p2, n2);
57  Scalar t = l0.intersectionParameter(hp);
58  VectorType pi = l0.pointAt(t);
59  VERIFY_IS_MUCH_SMALLER_THAN(hp.signedDistance(pi), RealScalar(1));
60  VERIFY_IS_MUCH_SMALLER_THAN(l0.distance(pi), RealScalar(1));
61  VERIFY_IS_APPROX(l0.intersectionPoint(hp), pi);
62 
63  // transform
65  MatrixType rot = MatrixType::Random(dim, dim).householderQr().householderQ();
67  Translation<Scalar, LineType::AmbientDimAtCompileTime> translation(VectorType::Random());
68 
69  while (scaling.diagonal().cwiseAbs().minCoeff() < RealScalar(1e-4)) scaling.diagonal() = VectorType::Random();
70 
71  LineType l1 = l0;
72  VectorType p3 = l0.pointAt(Scalar(1));
73  VERIFY_IS_MUCH_SMALLER_THAN(l1.transform(rot).distance(rot * p3), Scalar(1));
74  l1 = l0;
75  VERIFY_IS_MUCH_SMALLER_THAN(l1.transform(rot, Isometry).distance(rot * p3), Scalar(1));
76  l1 = l0;
77  VERIFY_IS_MUCH_SMALLER_THAN(l1.transform(rot * scaling).distance((rot * scaling) * p3), Scalar(1));
78  l1 = l0;
79  VERIFY_IS_MUCH_SMALLER_THAN(l1.transform(rot * scaling * translation).distance((rot * scaling * translation) * p3),
80  Scalar(1));
81  l1 = l0;
82  VERIFY_IS_MUCH_SMALLER_THAN(l1.transform(rot * translation, Isometry).distance((rot * translation) * p3),
83  Scalar(1));
84  }
85 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Vector3f p0
Definition: MatrixBase_all.cpp:2
Vector3f p1
Definition: MatrixBase_all.cpp:2
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Represents a diagonal matrix with its storage.
Definition: DiagonalMatrix.h:172
A hyperplane.
Definition: Hyperplane.h:37
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Represents a translation transformation.
Definition: Translation.h:33
@ Isometry
Definition: Constants.h:455
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
EIGEN_BLAS_FUNC() rot(int *n, Scalar *px, int *incx, Scalar *py, int *incy, Scalar *pc, Scalar *ps)
Definition: level1_real_impl.h:88
#define VERIFY_IS_MUCH_SMALLER_THAN(a, b)
Definition: main.h:371
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
static const unsigned Dim
Problem dimension.
Definition: two_d_tilted_square.cc:62
const Mdouble pi
Definition: ExtendedMath.h:23
t
Definition: plotPSD.py:36
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: main.h:736
Definition: fft_test_shared.h:66

References abs(), Eigen::DiagonalMatrix< Scalar_, SizeAtCompileTime, MaxSizeAtCompileTime >::diagonal(), Global_Variables::Dim, e(), Eigen::Isometry, p0, p1, constants::pi, rot(), plotPSD::t, VERIFY_IS_APPROX, and VERIFY_IS_MUCH_SMALLER_THAN.

Referenced by EIGEN_DECLARE_TEST().

◆ parametrizedline_alignment()

template<typename Scalar >
void parametrizedline_alignment ( )
88  {
91 
92  EIGEN_ALIGN_MAX Scalar array1[16];
93  EIGEN_ALIGN_MAX Scalar array2[16];
94  EIGEN_ALIGN_MAX Scalar array3[16 + 1];
95  Scalar *array3u = array3 + 1;
96 
97  Line4a *p1 = ::new (reinterpret_cast<void *>(array1)) Line4a;
98  Line4u *p2 = ::new (reinterpret_cast<void *>(array2)) Line4u;
99  Line4u *p3 = ::new (reinterpret_cast<void *>(array3u)) Line4u;
100 
101  p1->origin().setRandom();
102  p1->direction().setRandom();
103  *p2 = *p1;
104  *p3 = *p1;
105 
106  VERIFY_IS_APPROX(p1->origin(), p2->origin());
107  VERIFY_IS_APPROX(p1->origin(), p3->origin());
108  VERIFY_IS_APPROX(p1->direction(), p2->direction());
109  VERIFY_IS_APPROX(p1->direction(), p3->direction());
110 }
#define EIGEN_ALIGN_MAX
Definition: ConfigureVectorization.h:146

References EIGEN_ALIGN_MAX, p1, and VERIFY_IS_APPROX.