1 // Some tests for vgl_frustum_3d
2 // J.L. Mundy December. 1, 2013
3 
4 #include <iostream>
5 #ifdef _MSC_VER
6 #  include "vcl_msvc_warnings.h"
7 #endif
8 #include "testlib/testlib_test.h"
9 #include "vgl/vgl_frustum_3d.h"
10 #include "vgl/vgl_ray_3d.h"
11 #include "vgl/vgl_box_3d.h"
12 
13 
14 static void
test_all()15 test_all()
16 {
17   vgl_point_3d<double> apex(0.0, 0.0, 10.0);
18   vgl_point_3d<double> p0(10.0, 10.0, 0.0);
19   vgl_point_3d<double> p1(-10.0, 10.0, 0.0);
20   vgl_point_3d<double> p2(-10.0, -10.0, 0.0);
21   vgl_point_3d<double> p3(10.0, -10.0, 0.0);
22   vgl_vector_3d<double> dir0 = p0 - apex;
23   vgl_vector_3d<double> dir1 = p1 - apex;
24   vgl_vector_3d<double> dir2 = p2 - apex;
25   vgl_vector_3d<double> dir3 = p3 - apex;
26   vgl_ray_3d<double> r0(apex, dir0);
27   vgl_ray_3d<double> r1(apex, dir1);
28   vgl_ray_3d<double> r2(apex, dir2);
29   vgl_ray_3d<double> r3(apex, dir3);
30   double d0 = 5.0, d1 = 10.0;
31   vgl_vector_3d<double> norm(0.0, 0.0, 1.0);
32   std::vector<vgl_ray_3d<double>> rays;
33   rays.push_back(r0);
34   rays.push_back(r1);
35   rays.push_back(r2);
36   rays.push_back(r3);
37   vgl_frustum_3d<double> f(rays, norm, d0, d1);
38   std::cout << f;
39   bool in = f.contains(0.0, 0.0, 2.5);
40   bool not_in = !f.contains(10.0, 10.000001, 0.0);
41   TEST("Frustum contains a point", in && not_in, true);
42   vgl_box_3d<double> b = f.bounding_box();
43   vgl_box_3d<double> b_test;
44   vgl_point_3d<double> b0(-10, -10, 0), b1(10, 10, 5);
45   b_test.add(b0);
46   b_test.add(b1);
47   bool bgood = b == b_test;
48   vgl_point_3d<double> cent = f.centroid();
49   bgood = bgood && (cent == vgl_point_3d<double>(0.0, 0.0, 2.5));
50   TEST("Frustum bounding box and centroid", bgood, true);
51   bool conv = f.is_convex();
52   std::cout << (conv ? "Convex" : "Nonconvex") << std::endl;
53 }
54 
55 void
test_frustum_3d()56 test_frustum_3d()
57 {
58   std::cout << "*****************************\n"
59             << " Testing vgl_frustum_3d\n"
60             << "*****************************\n\n";
61 
62   test_all();
63 }
64 
65 
66 TESTMAIN(test_frustum_3d);
67