1 // Some tests for vgl_intersection
2 // J.L. Mundy June 13, 2014
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_box_2d.h"
10 #include "vgl/vgl_line_segment_2d.h"
11 #include "vgl/vgl_intersection.h"
12 #include "vgl/vgl_pointset_3d.h"
13 #include "vgl/vgl_plane_3d.h"
14 #include "vgl/vgl_box_3d.h"
15 void
test_intersection()16 test_intersection()
17 {
18   std::cout << "*****************************\n"
19             << " Testing vgl_intersection\n"
20             << "*****************************\n\n";
21   // unit box with lower left corner at (0, 0)
22   vgl_point_2d<double> pll(0.0, 0.0), pur(1.0, 1.0);
23   vgl_box_2d<double> box(pll, pur);
24   vgl_line_segment_2d<double> lint; // intersection line segment
25   // case I - line segment completely outside box
26   vgl_point_2d<double> p11(1.5, 1.5), p12(2.0, 2.0);
27   vgl_line_segment_2d<double> l1(p11, p12);
28   bool caseI = vgl_intersection(box, l1, lint);
29   TEST("No intersection", caseI, false);
30   // case II - line segment completely inside box
31   vgl_point_2d<double> p21(0.2, 0.2), p22(0.8, 0.8);
32   vgl_line_segment_2d<double> l2(p21, p22);
33   bool caseII = vgl_intersection(box, l2, lint);
34   caseII = caseII && (lint == l2);
35   TEST("Lineseg inside box", caseII, true);
36   // Case III - line segment intersects box and cuts line at two points
37   vgl_point_2d<double> p31(0.5, -0.5), p32(0.5, 1.5);
38   vgl_line_segment_2d<double> l3(p31, p32);
39   bool caseIII = vgl_intersection(box, l3, lint);
40   vgl_point_2d<double> p1III(0.5, 0.0), p2III(0.5, 1.0);
41   vgl_point_2d<double> pla = lint.point1(), plb = lint.point2();
42   caseIII = caseIII && (((p1III == pla) && (p2III == plb)) || ((p1III == plb) && (p2III == pla)));
43   TEST("Lineseg intersects box (2 pts.)", caseIII, true);
44   // Case IV - line segment intersects box and cuts line at one point
45   vgl_point_2d<double> p41(0.5, 0.5), p42(0.5, 1.5);
46   vgl_line_segment_2d<double> l4(p41, p42);
47   bool caseIV = vgl_intersection(box, l4, lint);
48   vgl_point_2d<double> p1IV(0.5, 0.5), p2IV(0.5, 1.0);
49   pla = lint.point1();
50   plb = lint.point2();
51   caseIV = caseIV && (((p1IV == pla) && (p2IV == plb)) || ((p1IV == plb) && (p2IV == pla)));
52   TEST("Lineseg intersects box (1 pt.)", caseIV, true);
53 
54   // test intersection of plane with pointset
55   vgl_point_3d<double> p0(-10, 1.0, 1.0);
56   vgl_point_3d<double> p1(-0.1, 2.0, 3.0);
57   vgl_point_3d<double> p2(0.05, 5.0, 6.0);
58   vgl_point_3d<double> p3(1.0, 1.0, 1.0);
59   vgl_pointset_3d<double> ptset;
60   ptset.add_point(p0);
61   ptset.add_point(p1);
62   ptset.add_point(p2);
63   ptset.add_point(p3);
64   vgl_vector_3d<double> n(1.0, 0.0, 0.0);
65   vgl_point_3d<double> org(0.0, 0.0, 0.0);
66   vgl_plane_3d<double> pl(n, org);
67   vgl_pointset_3d<double> psint = vgl_intersection<double>(pl, ptset, 1.0);
68   std::cout << psint << '\n';
69   TEST("Pointset intersect plane", psint.npts() == 2, true);
70   vgl_box_3d<double> box3;
71   box3.add(p1);
72   box3.add(p2);
73   vgl_pointset_3d<double> bint = vgl_intersection<double>(box3, ptset);
74   TEST("Pointset intersect box", bint.npts() == 2, true);
75 }
76 
77 
78 TESTMAIN(test_intersection);
79