1 // Some tests for vgl_distance
2 // Amitha Perera, Sep 2001.
3 #include <iostream>
4 #include <cmath>
5 #include "testlib/testlib_test.h"
6
7
8 #include "vgl/vgl_polygon.h"
9 #include "vgl/vgl_point_2d.h"
10 #include "vgl/vgl_line_segment_2d.h"
11 #include "vgl/vgl_distance.h"
12 #ifdef _MSC_VER
13 # include "vcl_msvc_warnings.h"
14 #endif
15
16
17 static void
test_point_to_polygon()18 test_point_to_polygon()
19 {
20 vgl_polygon<float> p;
21 p.new_sheet();
22 p.push_back(0.0f, 0.0f);
23 p.push_back(5.0f, 0.0f);
24 p.push_back(5.0f, 5.0f);
25
26 TEST_NEAR("point to polygon 1 distance", vgl_distance(p, vgl_point_2d<float>(6.0f, 1.0f)), 1.0, 1e-5);
27 TEST_NEAR("point to polygon 2 distance", vgl_distance(p, vgl_point_2d<float>(6.0f, 6.0f)), std::sqrt(2.0), 1e-5);
28 TEST_NEAR("point to polygon 3 distance", vgl_distance(p, vgl_point_2d<float>(3.0f, 4.0f)), std::sqrt(0.5), 1e-5);
29 TEST("point to polygon argument swap",
30 vgl_distance(p, vgl_point_2d<float>(3.0f, 4.0f)),
31 vgl_distance(vgl_point_2d<float>(3.0f, 4.0f), p));
32 }
33
34 static void
test_point_to_3D_line_segment()35 test_point_to_3D_line_segment()
36 {
37 // line segment (3,4,0)--(3,4,9), point (0,0,0) ==> distance is 5
38 double d = vgl_distance_to_linesegment(3., 4., 0., 3., 4., 9., 0., 0., 0.);
39 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
40 // line segment (0,1,4)--(4,4,4), point (8,7,4) ==> distance is 5
41 d = vgl_distance_to_linesegment(0., 1., 4., 4., 4., 4., 8., 7., 4.);
42 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
43 // line segment (0,3,4)--(6,3,4), point (2,0,0) ==> distance is 5
44 d = vgl_distance_to_linesegment(0., 3., 4., 6., 3., 4., 2., 0., 0.);
45 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
46 // Idem, with end points interchanged:
47 d = vgl_distance_to_linesegment(3., 4., 9., 3., 4., 0., 0., 0., 0.);
48 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
49 d = vgl_distance_to_linesegment(4., 4., 4., 0., 1., 4., 8., 7., 4.);
50 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
51 d = vgl_distance_to_linesegment(6., 3., 4., 0., 3., 4., 2., 0., 0.);
52 TEST_NEAR("vgl_distance_to_linesegment", d, 5, 1e-9);
53 }
54
55 static void
test_point_to_line_segment_2d()56 test_point_to_line_segment_2d()
57 {
58 std::cout << "-------------------------------------------------------\n"
59 << "Testing vgl_distance(vgl_line_segment_2d, vgl_point_2d)\n"
60 << "-------------------------------------------------------\n";
61 vgl_point_2d<double> p(1, 0);
62 vgl_point_2d<double> q(1, 1);
63 vgl_line_segment_2d<double> l(p, q);
64 vgl_point_2d<double> a(0, 0);
65 vgl_point_2d<double> b(1, -1);
66 vgl_point_2d<double> c(2, 2);
67
68 double d_la = vgl_distance(l, a);
69 double d_al = vgl_distance(a, l);
70 TEST("Interchange arguments OK?", d_la == d_al, true);
71 TEST("Test point a OK?", d_al == 1.0, true);
72 TEST("Test point b OK?", vgl_distance(b, l) == 1.0, true);
73 TEST_NEAR("Test point c OK?", vgl_distance(c, l), std::sqrt(2.0), 1e-9);
74 }
75
76
77 static void
test_distance()78 test_distance()
79 {
80 test_point_to_polygon();
81 test_point_to_3D_line_segment();
82 test_point_to_line_segment_2d();
83 }
84
85
86 TESTMAIN(test_distance);
87