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