1 // This is core/vgl/vgl_distance.h
2 #ifndef vgl_distance_h_
3 #define vgl_distance_h_
4 //:
5 // \file
6 // \brief Set of distance functions
7 // \author fsm
8 //
9 // Note that these functions return double, not the template parameter Type,
10 // since e.g. the distance between two vgl_point_2d<int> is not always an int,
11 // but even the squared distance between such a point and a line is not integer.
12 //
13 // \verbatim
14 // Modifications
15 // 2 July 2001 Peter Vanroose added vgl_distance(point,line) and (point,plane)
16 // 2 July 2001 Peter Vanroose inlined 4 functions and made return types double
17 // 2 Jan. 2003 Peter Vanroose corrected functions returning negative distance
18 // 5 June 2003 Peter Vanroose added vgl_distance(line_3d,line_3d)
19 // 11 June 2003 Peter Vanroose added vgl_distance(line_3d,point_3d)
20 // 14 Nov. 2003 Peter Vanroose made all functions templated
21 // 25 Sept 2004 Peter Vanroose added 3D vgl_distance_to_linesegment()
22 // 25 Sept 2004 Peter Vanroose added 3D vgl_distance_to_*_polygon()
23 // \endverbatim
24
25 #include "vgl_fwd.h" // forward declare various vgl classes
26
27 //: Squared distance between point \a (x,y) and closest point on line segment \a (x1,y1)-(x2,y2)
28 template <class T>
29 double vgl_distance2_to_linesegment(T x1, T y1,
30 T x2, T y2,
31 T x, T y);
32
33 //: Distance between point \a (x,y) and closest point on line segment \a (x1,y1)-(x2,y2)
34 template <class T>
35 double vgl_distance_to_linesegment(T x1, T y1,
36 T x2, T y2,
37 T x, T y);
38
39 //: Squared distance between point \a (x,y,z) and closest point on line segment \a (x1,y1,z1)-(x2,y2,z2)
40 template <class T>
41 double vgl_distance2_to_linesegment(T x1, T y1, T z1,
42 T x2, T y2, T z2,
43 T x, T y, T z);
44
45 //: Distance between point \a (x,y,z) and closest point on line segment \a (x1,y1,z1)-(x2,y2,z2)
46 template <class T>
47 double vgl_distance_to_linesegment(T x1, T y1, T z1,
48 T x2, T y2, T z2,
49 T x, T y, T z);
50
51 //: Distance between point \a (x,y) and closest point on open polygon \a (px[i],py[i])
52 template <class T>
53 double vgl_distance_to_non_closed_polygon(T const px[], T const py[], unsigned int n,
54 T x, T y);
55
56 //: Distance between point \a (x,y,z) and closest point on open polygon \a (px[i],py[i],pz[i])
57 template <class T>
58 double vgl_distance_to_non_closed_polygon(T const px[], T const py[], T const pz[], unsigned int n,
59 T x, T y, T z);
60
61 //: Distance between point \a (x,y) and closest point on closed polygon \a (px[i],py[i])
62 template <class T>
63 double vgl_distance_to_closed_polygon(T const px[], T const py[], unsigned int n,
64 T x, T y);
65
66 //: Distance between point \a (x,y,z) and closest point on closed polygon \a (px[i],py[i]),pz[i]
67 template <class T>
68 double vgl_distance_to_closed_polygon(T const px[], T const py[], T const pz[], unsigned int n,
69 T x, T y, T z);
70
71 //: find the shortest distance of the line to the origin
72 // \relatesalso vgl_line_2d
73 template <class T>
74 double vgl_distance_origin(vgl_line_2d<T> const& l);
75
76 //: find the shortest distance of the plane to the origin
77 // \relatesalso vgl_plane_3d
78 template <class T>
79 double vgl_distance_origin(vgl_plane_3d<T> const& pl);
80
81 //: find the shortest distance of the line to the origin
82 // \relatesalso vgl_line_3d_2_points
83 template <class T>
84 double vgl_distance_origin(vgl_line_3d_2_points<T> const& l);
85
86 //: find the shortest distance of the line to the origin
87 // \relatesalso vgl_homg_line_2d
88 template <class T>
89 double vgl_distance_origin(vgl_homg_line_2d<T> const& l);
90
91 //: find the shortest distance of the plane to the origin
92 // \relatesalso vgl_homg_plane_3d
93 template <class T>
94 double vgl_distance_origin(vgl_homg_plane_3d<T> const& pl);
95
96 //: find the shortest distance of the line to the origin
97 // \relatesalso vgl_homg_line_3d_2_points
98 template <class T>
99 double vgl_distance_origin(vgl_homg_line_3d_2_points<T> const& l);
100
101 //: return the distance between two points
102 // \relatesalso vgl_point_2d
103 template <class T> inline
vgl_distance(vgl_point_2d<T> const & p1,vgl_point_2d<T> const & p2)104 double vgl_distance(vgl_point_2d<T>const& p1,
105 vgl_point_2d<T>const& p2) { return length(p2-p1); }
106
107 //: return the distance between two points
108 // \relatesalso vgl_point_3d
109 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p1,vgl_point_3d<T> const & p2)110 double vgl_distance(vgl_point_3d<T>const& p1,
111 vgl_point_3d<T>const& p2) { return length(p2-p1); }
112
113 //: return the distance between two points
114 // \relatesalso vgl_homg_point_1d
115 template <class T>
116 double vgl_distance(vgl_homg_point_1d<T>const& p1,
117 vgl_homg_point_1d<T>const& p2);
118
119 //: return the distance between two points
120 // \relatesalso vgl_homg_point_2d
121 template <class T> inline
vgl_distance(vgl_homg_point_2d<T> const & p1,vgl_homg_point_2d<T> const & p2)122 double vgl_distance(vgl_homg_point_2d<T>const& p1,
123 vgl_homg_point_2d<T>const& p2) { return length(p2-p1); }
124
125 //: return the distance between two points
126 // \relatesalso vgl_homg_point_3d
127 template <class T> inline
vgl_distance(vgl_homg_point_3d<T> const & p1,vgl_homg_point_3d<T> const & p2)128 double vgl_distance(vgl_homg_point_3d<T>const& p1,
129 vgl_homg_point_3d<T>const& p2) { return length(p2-p1); }
130
131 //: return the perpendicular distance from a point to a line in 2D
132 // \relatesalso vgl_point_2d
133 // \relatesalso vgl_line_2d
134 template <class T>
135 double vgl_distance(vgl_line_2d<T> const& l,
136 vgl_point_2d<T> const& p);
137 template <class T> inline
vgl_distance(vgl_point_2d<T> const & p,vgl_line_2d<T> const & l)138 double vgl_distance(vgl_point_2d<T> const& p,
139 vgl_line_2d<T> const& l) { return vgl_distance(l,p); }
140
141 //: return the perpendicular distance from a point to a line in 2D
142 // \relatesalso vgl_homg_point_2d
143 // \relatesalso vgl_homg_line_2d
144 template <class T>
145 double vgl_distance(vgl_homg_line_2d<T> const& l,
146 vgl_homg_point_2d<T> const& p);
147 template <class T> inline
vgl_distance(vgl_homg_point_2d<T> const & p,vgl_homg_line_2d<T> const & l)148 double vgl_distance(vgl_homg_point_2d<T> const& p,
149 vgl_homg_line_2d<T> const& l) { return vgl_distance(l,p); }
150
151 //: return the perpendicular distance from a point to a plane in 3D
152 // \relatesalso vgl_point_3d
153 // \relatesalso vgl_plane_3d
154 template <class T>
155 double vgl_distance(vgl_plane_3d<T> const& l,
156 vgl_point_3d<T> const& p);
157 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p,vgl_plane_3d<T> const & l)158 double vgl_distance(vgl_point_3d<T> const& p,
159 vgl_plane_3d<T> const& l) { return vgl_distance(l,p); }
160
161 //: return the perpendicular distance from a point to a plane in 3D
162 // \relatesalso vgl_homg_point_3d
163 // \relatesalso vgl_homg_plane_3d
164 template <class T>
165 double vgl_distance(vgl_homg_plane_3d<T> const& l,
166 vgl_homg_point_3d<T> const& p);
167 template <class T> inline
vgl_distance(vgl_homg_point_3d<T> const & p,vgl_homg_plane_3d<T> const & l)168 double vgl_distance(vgl_homg_point_3d<T> const& p,
169 vgl_homg_plane_3d<T> const& l) { return vgl_distance(l,p); }
170
171 template <class T>
172 double vgl_distance(vgl_point_3d<T> const& p,
173 vgl_sphere_3d<T> const& s);
174 template <class T> inline
vgl_distance(vgl_sphere_3d<T> const & s,vgl_point_3d<T> const & p)175 double vgl_distance(vgl_sphere_3d<T> const& s,
176 vgl_point_3d<T> const& p){ return vgl_distance(p,s);}
177
178 //: distance to an infinite cylinder (length is ignored)
179 template <class T>
180 double vgl_distance(vgl_point_3d<T> const& p,
181 vgl_cylinder_3d<T> const& c);
182 template <class T> inline
vgl_distance(vgl_cylinder_3d<T> const & c,vgl_point_3d<T> const & p)183 double vgl_distance(vgl_cylinder_3d<T> const& c,
184 vgl_point_3d<T> const& p){ return vgl_distance(p,c);}
185
186 //: distance between a point and the closest point on the polygon.
187 // If the third argument is "false", the edge from last to first point of
188 // each polygon sheet is not considered part of the polygon.
189 // \relatesalso vgl_point_2d
190 // \relatesalso vgl_polygon
191 template <class T>
192 double vgl_distance(vgl_polygon<T> const& poly,
193 vgl_point_2d<T> const& point,
194 bool closed=true);
195
196 template <class T> inline
197 double vgl_distance(vgl_point_2d<T> const& point,
198 vgl_polygon<T> const& poly,
199 bool closed=true) { return vgl_distance(poly,point,closed); }
200
201 //: Return the perpendicular distance between two lines in 3D.
202 // See vgl_closest_point.h for more information.
203 // \relatesalso vgl_homg_line_3d_2_points
204
205 template <class T>
206 double vgl_distance(vgl_homg_line_3d_2_points<T> const& line1,
207 vgl_homg_line_3d_2_points<T> const& line2);
208
209 //: Return the perpendicular distance from a point to a line in 3D.
210 // See vgl_closest_point.h for more information.
211 // \relatesalso vgl_homg_line_3d_2_points
212 template <class T>
213 double vgl_distance(vgl_homg_line_3d_2_points<T> const& l,
214 vgl_homg_point_3d<T> const& p);
215
216 template <class T> inline
vgl_distance(vgl_homg_point_3d<T> const & p,vgl_homg_line_3d_2_points<T> const & l)217 double vgl_distance(vgl_homg_point_3d<T> const& p,
218 vgl_homg_line_3d_2_points<T> const& l) { return vgl_distance(l,p); }
219
220 //: Return the perpendicular distance from a point to a line in 3D.
221 // See vgl_closest_point.h for more information.
222 // \relatesalso vgl_line_3d_2_points
223 template <class T>
224 double vgl_distance(vgl_line_3d_2_points<T> const& l,
225 vgl_point_3d<T> const& p);
226
227 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p,vgl_line_3d_2_points<T> const & l)228 double vgl_distance(vgl_point_3d<T> const& p,
229 vgl_line_3d_2_points<T> const& l) { return vgl_distance(l,p); }
230
231 //: return the closest distance from a point to a ray
232 template <class T>
233 double vgl_distance(vgl_ray_3d<T> const& r,
234 vgl_point_3d<T> const& p);
235
236 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p,vgl_ray_3d<T> const & r)237 double vgl_distance(vgl_point_3d<T> const& p,
238 vgl_ray_3d<T> const& r) { return vgl_distance(r,p); }
239
240 //: return the closest distance from a point to an infinite line
241 template <class T>
242 double vgl_distance(vgl_infinite_line_3d<T> const& l,
243 vgl_point_3d<T> const& p);
244
245 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p,vgl_infinite_line_3d<T> const & l)246 double vgl_distance(vgl_point_3d<T> const& p,
247 vgl_infinite_line_3d<T> const& l) { return vgl_distance(l,p); }
248 //: Closest distance from a point \a p to a line segment \a l in 2D
249 // \relatesalso vgl_point_2d
250 // \relatesalso vgl_line_segment_2d
251 // \sa vgl_distance_to_linesegment()
252 // \sa vgl_distance2_to_linesegment()
253 template <class T>
254 double vgl_distance(vgl_line_segment_2d<T> const& l,
255 vgl_point_2d<T> const& p);
256 template <class T> inline
vgl_distance(vgl_point_2d<T> const & p,vgl_line_segment_2d<T> const & l)257 double vgl_distance(vgl_point_2d<T> const& p,
258 vgl_line_segment_2d<T> const& l) { return vgl_distance(l,p); }
259
260
261 //: Closest distance from a point \a p to a line segment \a l in 3D
262 // \relatesalso vgl_point_3d
263 // \relatesalso vgl_line_segment_3d
264 // \sa vgl_distance_to_linesegment()
265 // \sa vgl_distance2_to_linesegment()
266 template <class T>
267 double vgl_distance(vgl_line_segment_3d<T> const& l,
268 vgl_point_3d<T> const& p);
269 template <class T> inline
vgl_distance(vgl_point_3d<T> const & p,vgl_line_segment_3d<T> const & l)270 double vgl_distance(vgl_point_3d<T> const& p,
271 vgl_line_segment_3d<T> const& l) { return vgl_distance(l,p); }
272
273 //: closest distance from a point to a box (2d)
274 template <class T>
275 double vgl_distance(vgl_point_2d<T> const& p, vgl_box_2d<T> const& b);
276 template <class T>
vgl_distance(vgl_box_2d<T> const & b,vgl_point_2d<T> const & p)277 double vgl_distance(vgl_box_2d<T> const& b, vgl_point_2d<T> const& p){return vgl_distance(p,b);}
278
279
280 #endif // vgl_distance_h_
281