22#ifndef __stir_geometry_line_distances_H__
23#define __stir_geometry_line_distances_H__
28#ifdef BOOST_NO_STDC_NAMESPACE
46template <
class coordT>
80 const coordT eps = d0d0 * 10E-5;
82 const coordT denom =
square(d0d1) - d0d0 * d1d1;
83 coordT distance_squared;
84 if (std::fabs(denom) <= eps)
87 const coordT a0 = r10d0 / d0d0;
88 result = r0 + d0 * a0;
89 distance_squared = r10r10 -
square(r10d0) / d0d0;
94 const coordT a0 = (-d1d1 * r10d0 + d0d1 * r10d1) / denom;
95 const coordT a1 = (-d0d1 * r10d0 + d0d0 * r10d1) / denom;
97 result = ((r0 + d0 * a0) + (r1 + d1 * a1)) / 2;
98 distance_squared = (d1d1 *
square(r10d0) - 2 * d0d1 * r10d0 * r10d1 + d0d0 *
square(r10d1)) / denom + r10r10;
100 if (distance_squared >= 0)
101 return std::sqrt(distance_squared);
104 if (-distance_squared < eps)
109 return std::sqrt(distance_squared);
118template <
class coordT>
143 const coordT distance_squared = r10r10 -
square(r10d0) / d0d0;
144 if (distance_squared >= 0)
145 return std::sqrt(distance_squared);
148 if (-distance_squared < d0d0 * 10E-5)
153 return std::sqrt(distance_squared);
163template <
class coordT>
178 r1.x() = p1.x() + u * difference.x();
179 r1.y() = p1.y() + u * difference.y();
180 r1.z() = p1.z() + u * difference.z();
defines the stir::CartesianCoordinate3D<coordT> class
defines various classes for specifying a line in 3 dimensions
a templated class for 3-dimensional coordinates.
Definition CartesianCoordinate3D.h:53
A class for LORs.
Definition LORCoordinates.h:296
coordT inner_product(const BasicCoordinate< num_dimensions, coordT > &p1, const BasicCoordinate< num_dimensions, coordT > &p2)
compute sum_i p1[i] * p2[i]
Definition BasicCoordinate.inl:408
NUMBER square(const NUMBER &x)
returns the square of a number, templated.
Definition common.h:154
coordT coordinate_between_2_lines(CartesianCoordinate3D< coordT > &result, const LORAs2Points< coordT > &line0, const LORAs2Points< coordT > &line1)
find a point half-way between 2 lines and their distance
Definition line_distances.h:48
coordT distance_between_line_and_point(const LORAs2Points< coordT > &line, const CartesianCoordinate3D< coordT > &r1)
find the distance between a point and a line
Definition line_distances.h:120
void project_point_on_a_line(const CartesianCoordinate3D< coordT > &p1, const CartesianCoordinate3D< coordT > &p2, CartesianCoordinate3D< coordT > &r1)
Project a point on a line.
Definition line_distances.h:165