1 // Some tests for vgl_line_segment_3d
2 // J.L. Mundy July 2009
3 
4 #include <iostream>
5 #include <sstream>
6 #ifdef _MSC_VER
7 #  include "vcl_msvc_warnings.h"
8 #endif
9 #include "testlib/testlib_test.h"
10 #include "vgl/vgl_infinite_line_3d.h"
11 #include "vgl/vgl_distance.h"
12 
13 
14 static void
test_constructor()15 test_constructor()
16 {
17   vgl_vector_3d<double> t(0, 0, 2);
18   vgl_point_3d<double> p(1, 2, 3);
19   vgl_infinite_line_3d<double> inf_l(p, t);
20   vgl_vector_2d<double> x0 = inf_l.x0();
21   vgl_vector_3d<double> dir = inf_l.direction();
22   TEST_NEAR("Constructor from point and dir - compare x0", x0.x() + x0.y(), 3.0, 1e-5);
23   TEST_NEAR("Constructor from point and dir - compare dir", dir.z_, 1.0, 1e-5);
24   vgl_point_3d<double> p1(1, 2, 4);
25   vgl_infinite_line_3d<double> inf_l1(p, p1);
26   x0 = inf_l1.x0();
27   dir = inf_l1.direction();
28   TEST_NEAR("Constructor from point-point - compare x0", x0.x() + x0.y(), 3.0, 1e-5);
29   TEST_NEAR("Constructor from point-point - compare dir", dir.z_, 1.0, 1e-5);
30 }
31 
32 static void
test_operations()33 test_operations()
34 {
35   {
36     vgl_vector_3d<double> t(0, 0, 1);
37     vgl_point_3d<double> p(1, 2, 3), p0, pt;
38     vgl_infinite_line_3d<double> inf_l(p, t);
39     p0 = inf_l.point();
40     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(1, 2, 0)), 0, 1e-6);
41     pt = inf_l.point_t(1.0);
42     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 2, 1)), 0, 1e-6);
43     vgl_point_3d<double> x(1.0, 2.0, -3.0);
44     bool con = inf_l.contains(x);
45     TEST("Contains ", con, true);
46   }
47 
48   {
49     vgl_vector_3d<double> t(1, 0, 0);
50     vgl_point_3d<double> p(1, 2, 3), p0, pt;
51     vgl_infinite_line_3d<double> inf_l(p, t);
52     p0 = inf_l.point();
53     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(0, 2, 3)), 0, 1e-6);
54     pt = inf_l.point_t(1.0);
55     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 2, 3)), 0, 1e-6);
56     vgl_point_3d<double> x(-1.0, 2.0, 3.0);
57     bool con = inf_l.contains(x);
58     TEST("Contains ", con, true);
59   }
60 
61   {
62     vgl_vector_3d<double> t(0, 1, 0);
63     vgl_point_3d<double> p(1, 2, 3), p0, pt;
64     vgl_infinite_line_3d<double> inf_l(p, t);
65     p0 = inf_l.point();
66     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(1, 0, 3)), 0, 1e-6);
67     pt = inf_l.point_t(1.0);
68     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 1, 3)), 0, 1e-6);
69     vgl_point_3d<double> x(1.0, -2.0, 3.0);
70     bool con = inf_l.contains(x);
71     TEST("Contains ", con, true);
72   }
73 
74   {
75     vgl_vector_3d<double> t(0, 0, -1);
76     vgl_point_3d<double> p(1, 2, 3), p0, pt;
77     vgl_infinite_line_3d<double> inf_l(p, t);
78     p0 = inf_l.point();
79     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(1, 2, 0)), 0, 1e-6);
80     pt = inf_l.point_t(1.0);
81     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 2, 1)), 0, 1e-6);
82     vgl_point_3d<double> x(1.0, 2.0, -3.0);
83     bool con = inf_l.contains(x);
84     TEST("Contains ", con, true);
85   }
86 
87   {
88     vgl_vector_3d<double> t(-1, 0, 0);
89     vgl_point_3d<double> p(1, 2, 3), p0, pt;
90     vgl_infinite_line_3d<double> inf_l(p, t);
91     p0 = inf_l.point();
92     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(0, 2, 3)), 0, 1e-6);
93     pt = inf_l.point_t(1.0);
94     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 2, 3)), 0, 1e-6);
95     vgl_point_3d<double> x(-1.0, 2.0, 3.0);
96     bool con = inf_l.contains(x);
97     TEST("Contains ", con, true);
98   }
99 
100   {
101     vgl_vector_3d<double> t(0, -1, 0);
102     vgl_point_3d<double> p(1, 2, 3), p0, pt;
103     vgl_infinite_line_3d<double> inf_l(p, t);
104     p0 = inf_l.point();
105     TEST_NEAR("Closest point to origin", vgl_distance(p0, vgl_point_3d<double>(1, 0, 3)), 0, 1e-6);
106     pt = inf_l.point_t(1.0);
107     TEST_NEAR("Parametric point ", vgl_distance(pt, vgl_point_3d<double>(1, 1, 3)), 0, 1e-6);
108     vgl_point_3d<double> x(1.0, -2.0, 3.0);
109     bool con = inf_l.contains(x);
110     TEST("Contains ", con, true);
111   }
112   {
113     vgl_vector_3d<double> t(0, 1, 0);
114     vgl_point_3d<double> p(1, 2, 3);
115     vgl_infinite_line_3d<double> inf_l(p, t), in_inf_l;
116     std::stringstream ss;
117     ss << inf_l;
118     std::cout << " infl as writen to stream " << inf_l << std::endl;
119     ss >> in_inf_l;
120     std::cout << "infl members as read from stream " << in_inf_l.x0() << ' ' << in_inf_l.direction() << std::endl;
121     TEST("stream read ", inf_l == in_inf_l, true);
122   }
123 }
124 void
test_infinite_line_3d()125 test_infinite_line_3d()
126 {
127   std::cout << "*****************************\n"
128             << " Testing vgl_infinite_line_3d\n"
129             << "*****************************\n\n";
130 
131   test_constructor();
132   test_operations();
133 }
134 
135 
136 TESTMAIN(test_infinite_line_3d);
137