GteDistPointSegment.h
Go to the documentation of this file.
1 // David Eberly, Geometric Tools, Redmond WA 98052
2 // Copyright (c) 1998-2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
5 // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
6 // File Version: 3.0.0 (2016/06/19)
7 
8 #pragma once
9 
11 #include <Mathematics/GteSegment.h>
12 
13 namespace gte
14 {
15 
16 template <int N, typename Real>
17 class DCPQuery<Real, Vector<N, Real>, Segment<N, Real>>
18 {
19 public:
20  struct Result
21  {
23  Real segmentParameter; // t in [0,1]
24  Vector<N, Real> segmentClosest; // (1-t)*p[0] + t*p[1]
25  };
26 
27  Result operator()(Vector<N, Real> const& point,
28  Segment<N, Real> const& segment);
29 };
30 
31 // Template aliases for convenience.
32 template <int N, typename Real>
33 using DCPPointSegment =
35 
36 template <typename Real>
38 
39 template <typename Real>
41 
42 
43 template <int N, typename Real>
44 typename DCPQuery<Real, Vector<N, Real>, Segment<N, Real>>::Result
45 DCPQuery<Real, Vector<N, Real>, Segment<N, Real>>::operator()(
46  Vector<N, Real> const& point, Segment<N, Real> const& segment)
47 {
48  Result result;
49 
50  // The direction vector is not unit length. The normalization is deferred
51  // until it is needed.
52  Vector<N, Real> direction = segment.p[1] - segment.p[0];
53  Vector<N, Real> diff = point - segment.p[1];
54  Real t = Dot(direction, diff);
55  if (t >= (Real)0)
56  {
57  result.segmentParameter = (Real)1;
58  result.segmentClosest = segment.p[1];
59  }
60  else
61  {
62  diff = point - segment.p[0];
63  t = Dot(direction, diff);
64  if (t <= (Real)0)
65  {
66  result.segmentParameter = (Real)0;
67  result.segmentClosest = segment.p[0];
68  }
69  else
70  {
71  Real sqrLength = Dot(direction, direction);
72  if (sqrLength > (Real)0)
73  {
74  t /= sqrLength;
75  result.segmentParameter = t;
76  result.segmentClosest = segment.p[0] + t * direction;
77  }
78  else
79  {
80  result.segmentParameter = (Real)0;
81  result.segmentClosest = segment.p[0];
82  }
83  }
84  }
85 
86  diff = point - result.segmentClosest;
87  result.sqrDistance = Dot(diff, diff);
88  result.distance = sqrt(result.sqrDistance);
89 
90  return result;
91 }
92 
93 
94 }
GLsizei GLsizei GLfloat distance
Definition: glext.h:9704
Result operator()(Type0 const &primitive0, Type1 const &primitive1)
DualQuaternion< Real > Dot(DualQuaternion< Real > const &d0, DualQuaternion< Real > const &d1)
GLdouble GLdouble t
Definition: glext.h:239
GLuint64EXT * result
Definition: glext.h:10003


geometric_tools_engine
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 03:59:59