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