2 #ifndef vgl_distance_hxx_ 3 #define vgl_distance_hxx_ 29 # include <vcl_msvc_warnings.h> 33 static inline T square_of(T x) {
return x*x; }
49 T ddh = square_of(x2-x1) + square_of(y2-y1);
52 T dd1 = square_of(x-x1) + square_of(y-y1);
53 T dd2 = square_of(x-x2) + square_of(y-y2);
67 return square_of(a*x + b*y + c)/double(a*a + b*b);
84 T ddh = square_of(x2-x1) + square_of(y2-y1) + square_of(z2-z1);
87 T dd1 = square_of(x-x1) + square_of(y-y1) + square_of(z-z1);
88 T dd2 = square_of(x-x2) + square_of(y-y2) + square_of(z-z2);
101 T a = x2-x1, b = y2-y1, c = z2-z1;
104 double lambda = (a*(x-x1)+b*(y-y1)+c*(z-z1))/double(a*a+b*b+c*c);
106 return square_of(x-x1-lambda*a) + square_of(y-y1-lambda*b) + square_of(z-z1-lambda*c);
114 for (
unsigned i=0; i+1<n; ++i) {
131 for (
unsigned i=0; i+1<n; ++i) {
147 for (
unsigned i=0; i+1<n; ++i) {
149 px[i+1], py[i+1], pz[i+1],
162 px[0 ], py[0 ], pz[0 ],
164 for (
unsigned i=0; i+1<n; ++i) {
166 px[i+1], py[i+1], pz[i+1],
178 if (
l.c() == 0)
return 0.0;
179 else return std::abs(static_cast<double>(
l.c())) / std::sqrt(static_cast<double>(
l.a()*
l.a()+
l.b()*
l.b() ));
185 if (
l.c() == 0)
return 0.0;
186 else return std::abs(static_cast<double>(
l.c())) / std::sqrt(static_cast<double>(
l.a()*
l.a()+
l.b()*
l.b() ));
192 if (pl.
d() == 0)
return 0.0;
193 else return std::abs(static_cast<double>(pl.
d())) / std::sqrt(static_cast<double>( pl.
a()*pl.
a()+pl.
b()*pl.
b()+pl.
c()*pl.
c()) );
199 if (pl.
d() == 0)
return 0.0;
200 else return std::abs(static_cast<double>(pl.
d())) / std::sqrt(static_cast<double>( pl.
a()*pl.
a()+pl.
b()*pl.
b()+pl.
c()*pl.
c()) );
207 return std::sqrt(static_cast<double>(square_of(q.
x())+square_of(q.
y())+square_of(q.
z())))/q.
w();
214 return std::sqrt(static_cast<double>(square_of(q.
x())+square_of(q.
y())+square_of(q.
z())));
221 return std::abs(static_cast<double>(p1.
x()/p1.
w() - p2.
x()/p2.
w()));
227 T num =
l.a()*p.
x() +
l.b()*p.
y() +
l.c();
228 if (num == 0)
return 0.0;
229 else return std::abs(static_cast<double>(num)) / std::sqrt(static_cast<double>(
l.a()*
l.a() +
l.b()*
l.b()));
235 T num =
l.a()*p.
x() +
l.b()*p.
y() +
l.c()*p.
w();
236 if (num == 0)
return 0.0;
237 else return std::abs(static_cast<double>(num)) / std::sqrt(static_cast<double>(
l.a()*
l.a() +
l.b()*
l.b())) / p.
w();
243 T num =
l.nx()*p.
x() +
l.ny()*p.
y() +
l.nz()*p.
z() +
l.d();
244 if (num == 0)
return 0.0;
245 else return std::abs(static_cast<double>(num)) / std::sqrt(static_cast<double>(
l.nx()*
l.nx() +
l.ny()*
l.ny() +
l.nz()*
l.nz()));
251 T num =
l.nx()*p.
x() +
l.ny()*p.
y() +
l.nz()*p.
z() +
l.d()*p.
w();
252 if (num == 0)
return 0.0;
253 else return std::abs(static_cast<double>(num/p.
w())) / std::sqrt(static_cast<double>(
l.nx()*
l.nx() +
l.ny()*
l.ny() +
l.nz()*
l.nz()));
258 double r = static_cast<double>(s.
radius());
260 double d = vgl_distance<T>(p,c);
261 return std::fabs(d-r);
268 for (
unsigned int s=0; s < poly.
num_sheets(); ++s )
270 const std::vector<vgl_point_2d<T> > &sheet = poly[s];
271 unsigned int n = (
unsigned int)(sheet.size());
275 sheet[0 ].x(), sheet[0 ].y(),
276 point.
x(), point.
y()) :
278 sheet[1 ].x(), sheet[1 ].y(),
279 point.
x(), point.
y());
280 for (
unsigned int i=0; i+1 < n; ++i )
283 sheet[i+1].x(), sheet[i+1].y(),
284 point.
x(), point.
y());
287 if ( dist < 0 || dd < dist ) dist = dd;
299 if (pp.first.w() != 0)
327 l.point2().x(),
l.point2().y(),
336 l.point2().x(),
l.point2().y(),
l.point2().z(),
337 p.
x(), p.
y(), p.
z());
364 T min_d = std::numeric_limits<T>::max();
366 if(d < min_d) min_d = d;
368 if(d < min_d) min_d = d;
370 if(d < min_d) min_d = d;
372 if(d < min_d) min_d = d;
376 #undef VGL_DISTANCE_INSTANTIATE 377 #define VGL_DISTANCE_INSTANTIATE(T) \ 378 template double vgl_distance2_to_linesegment(T,T,T,T,T,T); \ 379 template double vgl_distance_to_linesegment(T,T,T,T,T,T); \ 380 template double vgl_distance2_to_linesegment(T,T,T,T,T,T,T,T,T); \ 381 template double vgl_distance_to_linesegment(T,T,T,T,T,T,T,T,T); \ 382 template double vgl_distance_to_non_closed_polygon(T const[],T const[],unsigned int,T,T); \ 383 template double vgl_distance_to_non_closed_polygon(T const[],T const[],T const[],unsigned int,T,T,T); \ 384 template double vgl_distance_to_closed_polygon(T const[],T const[],unsigned int,T,T); \ 385 template double vgl_distance_to_closed_polygon(T const[],T const[],T const[],unsigned int,T,T,T); \ 386 template double vgl_distance_origin(vgl_line_2d<T >const& l); \ 387 template double vgl_distance_origin(vgl_homg_line_2d<T >const& l); \ 388 template double vgl_distance_origin(vgl_plane_3d<T > const& pl); \ 389 template double vgl_distance_origin(vgl_homg_plane_3d<T > const& pl); \ 390 template double vgl_distance_origin(vgl_line_3d_2_points<T > const& l); \ 391 template double vgl_distance_origin(vgl_homg_line_3d_2_points<T > const& l); \ 392 template double vgl_distance(vgl_homg_point_1d<T >const&,vgl_homg_point_1d<T >const&); \ 393 template double vgl_distance(vgl_point_2d<T >const&,vgl_point_2d<T >const&); \ 394 template double vgl_distance(vgl_homg_point_2d<T >const&,vgl_homg_point_2d<T >const&); \ 395 template double vgl_distance(vgl_point_3d<T >const&,vgl_point_3d<T >const&); \ 396 template double vgl_distance(vgl_homg_point_3d<T >const&,vgl_homg_point_3d<T >const&); \ 397 template double vgl_distance(vgl_line_2d<T >const&,vgl_point_2d<T >const&); \ 398 template double vgl_distance(vgl_point_2d<T >const&,vgl_line_2d<T >const&); \ 399 template double vgl_distance(vgl_homg_line_2d<T >const&,vgl_homg_point_2d<T >const&); \ 400 template double vgl_distance(vgl_homg_point_2d<T >const&,vgl_homg_line_2d<T >const&); \ 401 template double vgl_distance(vgl_plane_3d<T >const&,vgl_point_3d<T >const&); \ 402 template double vgl_distance(vgl_point_3d<T >const&,vgl_plane_3d<T >const&); \ 403 template double vgl_distance(vgl_homg_plane_3d<T >const&,vgl_homg_point_3d<T >const&); \ 404 template double vgl_distance(vgl_homg_point_3d<T >const&,vgl_homg_plane_3d<T >const&); \ 405 template double vgl_distance(vgl_point_3d<T> const&, vgl_sphere_3d<T> const&); \ 406 template double vgl_distance(vgl_polygon<T >const&,vgl_point_2d<T >const&,bool); \ 407 template double vgl_distance(vgl_homg_line_3d_2_points<T >const&,vgl_homg_line_3d_2_points<T >const&); \ 408 template double vgl_distance(vgl_homg_line_3d_2_points<T >const&,vgl_homg_point_3d<T >const&); \ 409 template double vgl_distance(vgl_line_3d_2_points<T >const&,vgl_point_3d<T >const&); \ 410 template double vgl_distance(vgl_ray_3d<T > const& r, vgl_point_3d<T > const& p); \ 411 template double vgl_distance(vgl_infinite_line_3d<T > const& l, vgl_point_3d<T > const& p); \ 412 template double vgl_distance(vgl_homg_point_3d<T > const&,vgl_homg_line_3d_2_points<T > const&); \ 413 template double vgl_distance(vgl_line_segment_2d<T > const&, vgl_point_2d<T > const&); \ 414 template double vgl_distance(vgl_line_segment_3d<T > const&, vgl_point_3d<T > const&); \ 415 template double vgl_distance(vgl_point_2d<T> const& p, vgl_box_2d<T> const& b) 416 #endif // vgl_distance_hxx_
homogeneous plane in 3D projective space
point in projective 3D space
a point in 2D nonhomogeneous space
Represents a homogeneous 2D line.
T a() const
Return x coefficient.
vgl_point_2d< Type > max_point() const
Return upper right corner of box.
a point in homogeneous 1-D space, i.e., a homogeneous pair (x,w)
Type b() const
Return y coefficient.
Type c() const
Return z coefficient.
Type d() const
Return homogeneous scaling coefficient.
line in projective 2D space
Represents a homogeneous 3D point.
A class to hold a non-homogeneous representation of a 3D line.
Set of closest-point functions.
vgl_point_2d< T > vgl_closest_point_origin(vgl_line_2d< T > const &l)
Return the point on the given line closest to the origin.
T b() const
Return y coefficient.
a point in 3D nonhomogeneous space
line segment in 3D nonhomogeneous space
vgl_point_2d< T > vgl_closest_point(vgl_line_2d< T > const &l, vgl_point_2d< T > const &p)
Return the point on the given line closest to the given point.
double vgl_distance_origin(vgl_line_2d< T > const &l)
find the shortest distance of the line to the origin.
Represents a Euclidean 3D plane.
Represents a 3D line segment using two points.
a sphere in 3D nonhomogeneous space
double vgl_distance_to_non_closed_polygon(T const px[], T const py[], unsigned n, T x, T y)
point in projective 2D space
T d() const
Return constant coefficient.
Contains class to represent a cartesian 2D bounding box.
Type a() const
Return x coefficient.
Represents a 3-d line with position defined in the orthogonal plane passing through the origin.
const vgl_point_3d< Type > & centre() const
double vgl_distance2_to_linesegment(T x1, T y1, T x2, T y2, T x, T y)
Squared distance between point (x,y) and closest point on line segment (x1,y1)-(x2,...
double vgl_distance(vgl_point_2d< T >const &p1, vgl_point_2d< T >const &p2)
return the distance between two points.
double vgl_distance_to_closed_polygon(T const px[], T const py[], unsigned n, T x, T y)
vgl_point_2d< Type > min_point() const
Return lower left corner of box.
a plane in 3D nonhomogeneous space
Represents a homogeneous 1-D point, i.e., a homogeneous pair (x,w).
Set of distance functions.
Represents a homogeneous 2D point.
unsigned int num_sheets() const
vgl_homg_point_3d< Type > point_finite() const
Finite point (Could be an ideal point, if the whole line is at infinity.).
double vgl_distance_to_linesegment(T x1, T y1, T x2, T y2, T x, T y)
Distance between point (x,y) and closest point on line segment (x1,y1)-(x2,y2).
T c() const
Return z coefficient.
std::pair< vgl_homg_point_3d< T >, vgl_homg_point_3d< T > > vgl_closest_points(vgl_homg_line_3d_2_points< T > const &line1, vgl_homg_line_3d_2_points< T > const &line2)
Return the two points of nearest approach of two 3D lines, one on each line.
Represents a homogeneous 3D line using two points.