Code-Eli  0.3.6
minimum_distance_line_test_suite.hpp
Go to the documentation of this file.
1 /*********************************************************************************
2 * Copyright (c) 2013 David D. Marshall <ddmarsha@calpoly.edu>
3 *
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * David D. Marshall - initial code and implementation
11 ********************************************************************************/
12 
13 #ifndef minimum_distance_line_test_suite_hpp
14 #define minimum_distance_line_test_suite_hpp
15 
16 #include <cmath> // cos(), sin()
17 
18 #include <typeinfo> // typeid
19 
20 #include "eli/util/tolerance.hpp"
21 
23 
24 template<typename data__>
25 class minimum_distance_line_test_suite : public Test::Suite
26 {
27  private:
28  typedef data__ data_type;
29  typedef Eigen::Matrix<data_type, 1, 2> point_type2;
30  typedef Eigen::Matrix<data_type, 1, 3> point_type3;
32 
33  tolerance_type tol;
34 
35  protected:
36  void AddTests(const float &)
37  {
38  // add the tests
41  }
42  void AddTests(const double &)
43  {
44  // add the tests
47  }
48  void AddTests(const long double &)
49  {
50  // add the tests
53  }
54 
55  public:
57  {
58  AddTests(data__());
59  }
61  {
62  }
63 
64  private:
66  {
67  point_type2 pt, a0, a1;
68  data_type dist, t, dist_ref, t_ref;
69 
70  // x-axis as line
71  a0 << 0, 0;
72  a1 << 1, 0;
73  pt << 1, 2;
74  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
75  t_ref=1;
76  dist_ref=2;
77  TEST_ASSERT(tol.approximately_equal(t, t_ref));
78  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
79 
80  // y-axis as line
81  a0 << 0, 0;
82  a1 << 0, 2;
83  pt << 3, 4;
84  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
85  t_ref=2;
86  dist_ref=3;
87  TEST_ASSERT(tol.approximately_equal(t, t_ref));
88  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
89 
90  // line as a point
91  a0 << 0, 0;
92  a1 << 0, 0;
93  pt << 3, 4;
94  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
95  t_ref=0;
96  dist_ref=pt.norm();
97  TEST_ASSERT(tol.approximately_equal(t, t_ref));
98  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
99 
100  // general line from origin intersecting point
101  a0 << 0, 0;
102  a1 << 1, 3;
103  pt << 2, 6;
104  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
105  t_ref=2;
106  dist_ref=0;
107  TEST_ASSERT(tol.approximately_equal(t, t_ref));
108  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
109 
110  // general line from origin
111  a0 << 0, 0;
112  a1 << 3, 4;
113  pt << -1, 32; pt/=10;
114  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
115  t_ref=0.5;
116  dist_ref=2;
117  TEST_ASSERT(tol.approximately_equal(t, t_ref));
118  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
119 
120  // general line intersecting point
121  a0 << 2,-1;
122  a1 << 4, 2;
123  pt << 3, -0.5;
124  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
125  t_ref=0.25;
126  dist_ref=0;
127  TEST_ASSERT(tol.approximately_equal(t, t_ref));
128  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
129 
130  // general line
131  a0 << 2, 1;
132  a1 << 3,-4;
133  pt << 57, -56; pt/=10;
134  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
135  t_ref=1.5;
136  dist_ref=1;
137  TEST_ASSERT(tol.approximately_equal(t, t_ref));
138  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
139  }
140 
142  {
143  point_type3 a0, a1, pt;
144  data_type dist, t, dist_ref, t_ref;
145 
146  // x-axis as line
147  a0 << 0, 0, 0;
148  a1 << 1, 0, 0;
149  pt << 1, 2, 2;
150  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
151  t_ref=1;
152  dist_ref=std::sqrt(static_cast<data_type>(8));
153  TEST_ASSERT(tol.approximately_equal(t, t_ref));
154  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
155 
156  // y-axis as line
157  a0 << 0, 0, 0;
158  a1 << 0, 2, 0;
159  pt << 3, 4, -1;
160  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
161  t_ref=2;
162  dist_ref=std::sqrt(static_cast<data_type>(9+1));
163  TEST_ASSERT(tol.approximately_equal(t, t_ref));
164  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
165 
166  // line as a point
167  a0 << 0, 0, 0;
168  a1 << 0, 0, 0;
169  pt << 3, 4, 1;
170  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
171  t_ref=0;
172  dist_ref=pt.norm();
173  TEST_ASSERT(tol.approximately_equal(t, t_ref));
174  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
175 
176  // general line from origin intersecting point
177  a0 << 0, 0, 0;
178  a1 << 1, 3, 2;
179  pt << 2, 6, 4;
180  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
181  t_ref=2;
182  dist_ref=0;
183  TEST_ASSERT(tol.approximately_equal(t, t_ref));
184  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
185 
186  // general line from origin
187  a0 << 0, 0, 0;
188  a1 << 1, 2, 2;
189  pt << 3, 3, 0;
190  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
191  t_ref=1;
192  dist_ref=3;
193  TEST_ASSERT(tol.approximately_equal(t, t_ref));
194  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
195 
196  // general line intersecting point
197  a0 << 2,-1, 2;
198  a1 << 4, 2, 6;
199  pt << 3, -0.5, 3.5;
200  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
201  t_ref=0.25;
202  dist_ref=0;
203  TEST_ASSERT(tol.approximately_equal(t, t_ref));
204  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
205 
206  // general line
207  a0 << 2, 1, 1;
208  a1 << 1, 2, 2;
209  pt <<17,13,10; pt/=6;
210  dist=eli::geom::intersect::minimum_distance(t, a0, a1, pt);
211  t_ref=0.5;
212  dist_ref=0.5;
213  TEST_ASSERT(tol.approximately_equal(t, t_ref));
214  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
215  }
216 };
217 
218 #endif
219 
curve::piecewise< curve1__, data1__, dim1__, tol1__ >::data_type minimum_distance(typename curve::piecewise< curve1__, data1__, dim1__, tol1__ >::data_type &t, const curve::piecewise< curve1__, data1__, dim1__, tol1__ > &pc, const typename curve::piecewise< curve1__, data1__, dim1__, tol1__ >::point_type &pt)
Eigen::Matrix< data_type, 1, 3 > point_type3
Definition: minimum_distance_line_test_suite.hpp:30
Definition: minimum_distance_line_test_suite.hpp:25
bool approximately_equal(const Eigen::MatrixBase< Derived1 > &m1, const Eigen::MatrixBase< Derived2 > &m2) const
Definition: tolerance.hpp:99
void AddTests(const long double &)
Definition: minimum_distance_line_test_suite.hpp:48
~minimum_distance_line_test_suite()
Definition: minimum_distance_line_test_suite.hpp:60
eli::util::tolerance< data_type > tolerance_type
Definition: minimum_distance_line_test_suite.hpp:31
tolerance_type tol
Definition: minimum_distance_line_test_suite.hpp:33
data__ data_type
Definition: minimum_distance_line_test_suite.hpp:28
void point_3d_test()
Definition: minimum_distance_line_test_suite.hpp:141
Eigen::Matrix< data_type, 1, 2 > point_type2
Definition: minimum_distance_line_test_suite.hpp:29
minimum_distance_line_test_suite()
Definition: minimum_distance_line_test_suite.hpp:56
void AddTests(const double &)
Definition: minimum_distance_line_test_suite.hpp:42
void point_2d_test()
Definition: minimum_distance_line_test_suite.hpp:65
void AddTests(const float &)
Definition: minimum_distance_line_test_suite.hpp:36