Code-Eli  0.3.6
minimum_distance_bounding_box_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_bounding_box_test_suite_hpp
14 #define minimum_distance_bounding_box_test_suite_hpp
15 
16 #include <cmath> // cos(), sin()
17 
18 #include <typeinfo> // typeid
19 
22 
23 template<typename data__>
24 class minimum_distance_bounding_box_test_suite : public Test::Suite
25 {
26  private:
27  typedef data__ data_type;
34 
37 
38  tolerance_type tol;
39 
40  protected:
41  void AddTests(const float &)
42  {
43  // add the tests
47  }
48  void AddTests(const double &)
49  {
50  // add the tests
54  }
55  void AddTests(const long double &)
56  {
57  // add the tests
61  }
62 
63  public:
65  {
66  AddTests(data__());
67  }
69  {
70  }
71 
72  private:
74  {
75  bounding_box_type1 bb;
76  point_type1 pt;
77  data_type dist, dist_ref;
78 
79  pt << -1;
80  bb.add(pt);
81  pt << 1;
82  bb.add(pt);
83 
84  // test lower than min
85  pt << -3;
86  dist_ref=std::abs(pt.x()-bb.get_min().x());
88  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
89 
90  // test higher than max
91  pt << 3;
92  dist_ref=std::abs(pt.x()-bb.get_max().x());
94  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
95 
96  // test inside
97  pt << 0;
98  dist_ref=static_cast<data_type>(0);
100  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
101  pt << 0.5;
102  dist_ref=static_cast<data_type>(0);
104  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
105 
106  // test on point
107  pt << 1;
108  dist_ref=static_cast<data_type>(0);
110  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
111  }
112 
114  {
115  bounding_box_type2 bb;
116  point_type2 pt, corner;
117  data_type dist, dist_ref;
118 
119  pt << -1, -1;
120  bb.add(pt);
121  pt << 1, 1;
122  bb.add(pt);
123 
124  // test lower than x-min, lower than y-min
125  pt << -3, -3;
126  corner << bb.get_min().x(), bb.get_min().y();
127  dist_ref=eli::geom::point::distance(pt, corner);
129  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
130 
131  // test lower than x-min, higher than y-max
132  pt << -3, 3;
133  corner << bb.get_min().x(), bb.get_max().y();
134  dist_ref=eli::geom::point::distance(pt, corner);
136  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
137 
138  // test higher than x-max, lower than y-min
139  pt << 3, -3;
140  corner << bb.get_max().x(), bb.get_min().y();
141  dist_ref=eli::geom::point::distance(pt, corner);
143  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
144 
145  // test higher than x-max, higher than y-max
146  pt << 3, 3;
147  corner << bb.get_max().x(), bb.get_max().y();
148  dist_ref=eli::geom::point::distance(pt, corner);
150  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
151 
152  // test lower than x-min, inside y
153  pt << -3, 0;
154  dist_ref=std::abs(pt.x()-bb.get_min().x());
156  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
157 
158  // test higher than x-max, inside y
159  pt << 3, 0;
160  dist_ref=std::abs(pt.x()-bb.get_max().x());
162  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
163 
164  // test inside x, lower than y-min
165  pt << 0, -4;
166  dist_ref=std::abs(pt.y()-bb.get_min().y());
168  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
169 
170  // test inside x, higher than y-max
171  pt << 0, 4;
172  dist_ref=std::abs(pt.y()-bb.get_max().y());
174  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
175 
176  // test inside
177  pt << 0, 0;
178  dist_ref=static_cast<data_type>(0);
180  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
181  pt << 0.5, 0.5;
182  dist_ref=static_cast<data_type>(0);
184  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
185 
186  // test on point
187  pt << 1, -1;
188  dist_ref=static_cast<data_type>(0);
190  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
191  pt << -1, -1;
192  dist_ref=static_cast<data_type>(0);
194  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
195  }
196 
198  {
199  bounding_box_type3 bb;
200  point_type3 pt, corner;
201  data_type dist, dist_ref;
202 
203  pt << -1, -1, -1;
204  bb.add(pt);
205  pt << 1, 1, 1;
206  bb.add(pt);
207 
208  // test lower than x-min, lower than y-min, lower than z-min
209  pt << -3, -3, -3;
210  corner << bb.get_min().x(), bb.get_min().y(), bb.get_min().z();
211  dist_ref=eli::geom::point::distance(pt, corner);
213  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
214 
215  // test lower than x-min, higher than y-max, lower than z-min
216  pt << -3, 3, -3;
217  corner << bb.get_min().x(), bb.get_max().y(), bb.get_min().z();
218  dist_ref=eli::geom::point::distance(pt, corner);
220  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
221 
222  // test higher than x-max, lower than y-min, lower than z-min
223  pt << 3, -3, -3;
224  corner << bb.get_max().x(), bb.get_min().y(), bb.get_min().z();
225  dist_ref=eli::geom::point::distance(pt, corner);
227  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
228 
229  // test higher than x-max, lower than y-max, lower than z-min
230  pt << 3, 3, -3;
231  corner << bb.get_max().x(), bb.get_max().y(), bb.get_min().z();
232  dist_ref=eli::geom::point::distance(pt, corner);
234  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
235 
236  // test lower than x-min, lower than y-min, higher than z-max
237  pt << -3, -3, 3;
238  corner << bb.get_min().x(), bb.get_min().y(), bb.get_max().z();
239  dist_ref=eli::geom::point::distance(pt, corner);
241  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
242 
243  // test lower than x-min, higher than y-max, higher than z-max
244  pt << -3, 3, 3;
245  corner << bb.get_min().x(), bb.get_max().y(), bb.get_max().z();
246  dist_ref=eli::geom::point::distance(pt, corner);
248  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
249 
250  // test higher than x-max, lower than y-min, higher than z-max
251  pt << 3, -3, 3;
252  corner << bb.get_max().x(), bb.get_min().y(), bb.get_max().z();
253  dist_ref=eli::geom::point::distance(pt, corner);
255  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
256 
257  // test higher than x-max, lower than y-max, lower than z-max
258  pt << 3, 3, 3;
259  corner << bb.get_max().x(), bb.get_max().y(), bb.get_max().z();
260  dist_ref=eli::geom::point::distance(pt, corner);
262  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
263 
264  // test inside x, lower than y-min, lower than z-min
265  pt << 0, -3, -3;
266  corner << 0, bb.get_min().y(), bb.get_min().z();
267  dist_ref=eli::geom::point::distance(pt, corner);
269  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
270 
271  // test inside x, lower than y-max, lower than z-min
272  pt << 0, 3, -3;
273  corner << 0, bb.get_max().y(), bb.get_min().z();
274  dist_ref=eli::geom::point::distance(pt, corner);
276  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
277 
278  // test inside x, lower than y-min, lower than z-max
279  pt << 0, -3, 3;
280  corner << 0, bb.get_min().y(), bb.get_max().z();
281  dist_ref=eli::geom::point::distance(pt, corner);
283  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
284 
285  // test inside x, lower than y-max, lower than z-max
286  pt << 0, 3, 3;
287  corner << 0, bb.get_max().y(), bb.get_max().z();
288  dist_ref=eli::geom::point::distance(pt, corner);
290  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
291 
292  // test lower than x-min, inside y, lower than z-min
293  pt << -3, 0, -3;
294  corner << bb.get_min().x(), 0, bb.get_min().z();
295  dist_ref=eli::geom::point::distance(pt, corner);
297  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
298 
299  // test lower than x-min, inside y, lower than z-max
300  pt << -3, 0, 3;
301  corner << bb.get_min().x(), 0, bb.get_max().z();
302  dist_ref=eli::geom::point::distance(pt, corner);
304  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
305 
306  // test lower than x-max, inside y, lower than z-min
307  pt << 3, 0, -3;
308  corner << bb.get_max().x(), 0, bb.get_min().z();
309  dist_ref=eli::geom::point::distance(pt, corner);
311  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
312 
313  // test lower than x-max, inside y, lower than z-max
314  pt << 3, 0, 3;
315  corner << bb.get_max().x(), 0, bb.get_max().z();
316  dist_ref=eli::geom::point::distance(pt, corner);
318  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
319 
320  // test lower than x-min, lower than y-min, inside z
321  pt <<-3, -3, 0;
322  corner <<bb.get_min().x(), bb.get_min().y(), 0;
323  dist_ref=eli::geom::point::distance(pt, corner);
325  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
326 
327  // test lower than x-max, lower than y-min, inside z
328  pt <<3, -3, 0;
329  corner <<bb.get_max().x(), bb.get_min().y(), 0;
330  dist_ref=eli::geom::point::distance(pt, corner);
332  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
333 
334  // test lower than x-min, lower than y-max, inside z
335  pt <<-3, 3, 0;
336  corner <<bb.get_min().x(), bb.get_max().y(), 0;
337  dist_ref=eli::geom::point::distance(pt, corner);
339  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
340 
341  // test lower than x-max, lower than y-max, inside z
342  pt << 3, 3, 0;
343  corner <<bb.get_max().x(), bb.get_max().y(), 0;
344  dist_ref=eli::geom::point::distance(pt, corner);
346  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
347 
348  // test lower than x-min, inside y, inside z
349  pt << -3, 0, 0;
350  dist_ref=std::abs(pt.x()-bb.get_min().x());
352  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
353 
354  // test higher than x-max, inside y, inside z
355  pt << 3, 0, 0;
356  dist_ref=std::abs(pt.x()-bb.get_max().x());
358  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
359 
360  // test inside x, lower than y-min, inside z
361  pt << 0, -3, 0;
362  dist_ref=std::abs(pt.y()-bb.get_min().y());
364  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
365 
366  // test inside x, higher than y-max, inside z
367  pt << 0, 3, 0;
368  dist_ref=std::abs(pt.y()-bb.get_max().y());
370  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
371 
372  // test inside x, inside y, lower than z-min
373  pt << 0, 0, -3;
374  dist_ref=std::abs(pt.z()-bb.get_min().z());
376  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
377 
378  // test inside x, inside y, higher than z-max
379  pt << 0, 0, 3;
380  dist_ref=std::abs(pt.z()-bb.get_max().z());
382  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
383 
384  // test inside
385  pt << 0, 0, 0;
386  dist_ref=static_cast<data_type>(0);
388  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
389  pt << 0.5, 0.5, 0.5;
390  dist_ref=static_cast<data_type>(0);
392  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
393  pt <<-0.5, 0.25, 0;
394  dist_ref=static_cast<data_type>(0);
396  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
397 
398  // test on point
399  pt << 1, -1, 1;
400  dist_ref=static_cast<data_type>(0);
402  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
403  pt << -1, -1, -1;
404  dist_ref=static_cast<data_type>(0);
406  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
407  pt << 1, 0.5, -1;
408  dist_ref=static_cast<data_type>(0);
410  TEST_ASSERT(tol.approximately_equal(dist, dist_ref));
411  }
412 };
413 
414 #endif
415 
void AddTests(const long double &)
Definition: minimum_distance_bounding_box_test_suite.hpp:55
eli::geom::general::bounding_box< data__, 1 > bounding_box_type1
Definition: minimum_distance_bounding_box_test_suite.hpp:28
bounding_box_type1::point_type point_type1
Definition: minimum_distance_bounding_box_test_suite.hpp:29
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)
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
point_type::Index index_type
Definition: bounding_box.hpp:33
Definition: bounding_box.hpp:27
bounding_box_type1::tolerance_type tolerance_type
Definition: minimum_distance_bounding_box_test_suite.hpp:35
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: bounding_box.hpp:32
void point_3d_test()
Definition: minimum_distance_bounding_box_test_suite.hpp:197
point_type get_max() const
Definition: bounding_box.hpp:104
eli::geom::general::bounding_box< data__, 2 > bounding_box_type2
Definition: minimum_distance_bounding_box_test_suite.hpp:30
void point_2d_test()
Definition: minimum_distance_bounding_box_test_suite.hpp:113
bounding_box_type2::point_type point_type2
Definition: minimum_distance_bounding_box_test_suite.hpp:31
void point_1d_test()
Definition: minimum_distance_bounding_box_test_suite.hpp:73
tol__ tolerance_type
Definition: bounding_box.hpp:34
void AddTests(const float &)
Definition: minimum_distance_bounding_box_test_suite.hpp:41
bool add(const point_type &p)
Definition: bounding_box.hpp:113
bounding_box_type1::index_type index_type
Definition: minimum_distance_bounding_box_test_suite.hpp:36
point_type get_min() const
Definition: bounding_box.hpp:93
tolerance_type tol
Definition: minimum_distance_bounding_box_test_suite.hpp:38
minimum_distance_bounding_box_test_suite()
Definition: minimum_distance_bounding_box_test_suite.hpp:64
eli::geom::general::bounding_box< data__, 3 > bounding_box_type3
Definition: minimum_distance_bounding_box_test_suite.hpp:32
void AddTests(const double &)
Definition: minimum_distance_bounding_box_test_suite.hpp:48
bounding_box_type3::point_type point_type3
Definition: minimum_distance_bounding_box_test_suite.hpp:33
data__ data_type
Definition: minimum_distance_bounding_box_test_suite.hpp:27
Definition: minimum_distance_bounding_box_test_suite.hpp:24
~minimum_distance_bounding_box_test_suite()
Definition: minimum_distance_bounding_box_test_suite.hpp:68