GteDistPointTriangleExact.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 
12 
13 namespace gte
14 {
15 
16 template <int N, typename Rational>
18 {
19 public:
20  struct Result
21  {
22  Rational sqrDistance;
23  Rational parameter[3]; // barycentric coordinates for triangle.v[3]
25  };
26 
28  Triangle<N, Rational> const& triangle);
29 };
30 
31 
32 template <int N, typename Rational>
35  Vector<N, Rational> const& point, Triangle<N, Rational> const& triangle)
36 {
37  Vector<N, Rational> diff = point - triangle.v[0];
38  Vector<N, Rational> edge0 = triangle.v[1] - triangle.v[0];
39  Vector<N, Rational> edge1 = triangle.v[2] - triangle.v[0];
40  Rational a00 = Dot(edge0, edge0);
41  Rational a01 = Dot(edge0, edge1);
42  Rational a11 = Dot(edge1, edge1);
43  Rational b0 = -Dot(diff, edge0);
44  Rational b1 = -Dot(diff, edge1);
45  Rational const zero = (Rational)0;
46  Rational const one = (Rational)1;
47  Rational det = a00 * a11 - a01 * a01;
48  Rational t0 = a01 * b1 - a11 * b0;
49  Rational t1 = a01 * b0 - a00 * b1;
50 
51  if (t0 + t1 <= det)
52  {
53  if (t0 < zero)
54  {
55  if (t1 < zero) // region 4
56  {
57  if (b0 < zero)
58  {
59  t1 = zero;
60  if (-b0 >= a00) // V1
61  {
62  t0 = one;
63  }
64  else // E01
65  {
66  t0 = -b0 / a00;
67  }
68  }
69  else
70  {
71  t0 = zero;
72  if (b1 >= zero) // V0
73  {
74  t1 = zero;
75  }
76  else if (-b1 >= a11) // V2
77  {
78  t1 = one;
79  }
80  else // E20
81  {
82  t1 = -b1 / a11;
83  }
84  }
85  }
86  else // region 3
87  {
88  t0 = zero;
89  if (b1 >= zero) // V0
90  {
91  t1 = zero;
92  }
93  else if (-b1 >= a11) // V2
94  {
95  t1 = one;
96  }
97  else // E20
98  {
99  t1 = -b1 / a11;
100  }
101  }
102  }
103  else if (t1 < zero) // region 5
104  {
105  t1 = zero;
106  if (b0 >= zero) // V0
107  {
108  t0 = zero;
109  }
110  else if (-b0 >= a00) // V1
111  {
112  t0 = one;
113  }
114  else // E01
115  {
116  t0 = -b0 / a00;
117  }
118  }
119  else // region 0, interior
120  {
121  Rational invDet = one / det;
122  t0 *= invDet;
123  t1 *= invDet;
124  }
125  }
126  else
127  {
128  Rational tmp0, tmp1, numer, denom;
129 
130  if (t0 < zero) // region 2
131  {
132  tmp0 = a01 + b0;
133  tmp1 = a11 + b1;
134  if (tmp1 > tmp0)
135  {
136  numer = tmp1 - tmp0;
137  denom = a00 - ((Rational)2)*a01 + a11;
138  if (numer >= denom) // V1
139  {
140  t0 = one;
141  t1 = zero;
142  }
143  else // E12
144  {
145  t0 = numer / denom;
146  t1 = one - t0;
147  }
148  }
149  else
150  {
151  t0 = zero;
152  if (tmp1 <= zero) // V2
153  {
154  t1 = one;
155  }
156  else if (b1 >= zero) // V0
157  {
158  t1 = zero;
159  }
160  else // E20
161  {
162  t1 = -b1 / a11;
163  }
164  }
165  }
166  else if (t1 < zero) // region 6
167  {
168  tmp0 = a01 + b1;
169  tmp1 = a00 + b0;
170  if (tmp1 > tmp0)
171  {
172  numer = tmp1 - tmp0;
173  denom = a00 - ((Rational)2)*a01 + a11;
174  if (numer >= denom) // V2
175  {
176  t1 = one;
177  t0 = zero;
178  }
179  else // E12
180  {
181  t1 = numer / denom;
182  t0 = one - t1;
183  }
184  }
185  else
186  {
187  t1 = zero;
188  if (tmp1 <= zero) // V1
189  {
190  t0 = one;
191  }
192  else if (b0 >= zero) // V0
193  {
194  t0 = zero;
195  }
196  else // E01
197  {
198  t0 = -b0 / a00;
199  }
200  }
201  }
202  else // region 1
203  {
204  numer = a11 + b1 - a01 - b0;
205  if (numer <= zero) // V2
206  {
207  t0 = zero;
208  t1 = one;
209  }
210  else
211  {
212  denom = a00 - ((Rational)2)*a01 + a11;
213  if (numer >= denom) // V1
214  {
215  t0 = one;
216  t1 = zero;
217  }
218  else // 12
219  {
220  t0 = numer / denom;
221  t1 = one - t0;
222  }
223  }
224  }
225  }
226 
227  Result result;
228  result.parameter[0] = one - t0 - t1;
229  result.parameter[1] = t0;
230  result.parameter[2] = t1;
231  result.closest = triangle.v[0] + t0 * edge0 + t1 * edge1;
232  diff = point - result.closest;
233  result.sqrDistance = Dot(diff, diff);
234  return result;
235 }
236 
237 
238 }
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
Definition: glext.h:9013
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
Definition: glext.h:9013
Result operator()(Vector< N, Rational > const &point, Triangle< N, Rational > const &triangle)
DualQuaternion< Real > Dot(DualQuaternion< Real > const &d0, DualQuaternion< Real > const &d1)
std::array< Vector< N, Real >, 3 > v
Definition: GteTriangle.h:30
GLuint64EXT * result
Definition: glext.h:10003


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