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