PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
EdgeEdgeCcd.h
Go to the documentation of this file.
1
10
11#ifndef PBAT_GEOMETRY_EDGEEDGECCD_H
12#define PBAT_GEOMETRY_EDGEEDGECCD_H
13
14#include "pbat/HostDevice.h"
16#include "pbat/math/linalg/mini/Concepts.h"
17#include "pbat/math/linalg/mini/Matrix.h"
18#include "pbat/math/linalg/mini/Reductions.h"
20
21#include <array>
22#include <cmath>
23
24namespace pbat::geometry {
25
26namespace detail {
27
58template <
59 math::linalg::mini::CReadableVectorizedMatrix TP1T,
60 math::linalg::mini::CReadableVectorizedMatrix TQ1T,
61 math::linalg::mini::CReadableVectorizedMatrix TP2T,
62 math::linalg::mini::CReadableVectorizedMatrix TQ2T,
63 math::linalg::mini::CReadableVectorizedMatrix TP1,
64 math::linalg::mini::CReadableVectorizedMatrix TQ1,
65 math::linalg::mini::CReadableVectorizedMatrix TP2,
66 math::linalg::mini::CReadableVectorizedMatrix TQ2,
67 class TScalar = typename TP1T::ScalarType>
68PBAT_HOST_DEVICE std::array<TScalar, 4> EdgeEdgeCcdUnivariatePolynomial(
69 TP1T const& P1T,
70 TQ1T const& Q1T,
71 TP2T const& P2T,
72 TQ2T const& Q2T,
73 TP1 const& P1,
74 TQ1 const& Q1,
75 TP2 const& P2,
76 TQ2 const& Q2);
77
78} // namespace detail
79
117template <
118 math::linalg::mini::CReadableVectorizedMatrix TP1T,
119 math::linalg::mini::CReadableVectorizedMatrix TQ1T,
120 math::linalg::mini::CReadableVectorizedMatrix TP2T,
121 math::linalg::mini::CReadableVectorizedMatrix TQ2T,
122 math::linalg::mini::CReadableVectorizedMatrix TP1,
123 math::linalg::mini::CReadableVectorizedMatrix TQ1,
124 math::linalg::mini::CReadableVectorizedMatrix TP2,
125 math::linalg::mini::CReadableVectorizedMatrix TQ2,
126 class TScalar = typename TP1T::ScalarType>
127PBAT_HOST_DEVICE auto EdgeEdgeCcd(
128 TP1T const& P1T,
129 TQ1T const& Q1T,
130 TP2T const& P2T,
131 TQ2T const& Q2T,
132 TP1 const& P1,
133 TQ1 const& Q1,
134 TP2 const& P2,
135 TQ2 const& Q2) -> math::linalg::mini::SVector<TScalar, 3>
136{
137 auto constexpr kDims = TP1T::kRows;
138 // 1. Form co-planarity polynomial
139 std::array<TScalar, 4> const coeffs =
140 detail::EdgeEdgeCcdUnivariatePolynomial(P1T, Q1T, P2T, Q2T, P1, Q1, P2, Q2);
141 // 2. Filter roots
142 using namespace pbat::math::linalg::mini;
143 SVector<TScalar, 3> r;
144 bool const bIntersectionFound = math::polynomial::ForEachRoot<3>(
145 [&](TScalar t) {
146 // 3. Compute barycentric coordinates of intersection point (if any) at root
147 auto uv = r.template Slice<2, 1>(1, 0);
148 SVector<TScalar, kDims> const p1 = P1T + t * (P1 - P1T);
149 SVector<TScalar, kDims> const q1 = Q1T + t * (Q1 - Q1T);
150 SVector<TScalar, kDims> const p2 = P2T + t * (P2 - P2T);
151 SVector<TScalar, kDims> const q2 = Q2T + t * (Q2 - Q2T);
152 auto constexpr zero = std::numeric_limits<TScalar>::min();
153 uv = ClosestPointQueries::Lines(p1, q1, p2, q2, zero);
154 // 4. Check if there is any intersection point, i.e. closest points on lines must be in
155 // the line segments, and the distance between the closest points must be zero.
156 bool const bIsInsideEdges = All((uv >= TScalar(0)) and (uv <= TScalar(1)));
157 TScalar const d2 = SquaredNorm((p1 + uv[0] * (q1 - p1)) - (p2 + uv[1] * (q2 - p2)));
158 bool const bIsIntersection = (d2 <= zero) and bIsInsideEdges;
159 r[0] = bIsIntersection * t + (not bIsIntersection) * r[0];
160 // Exit as soon as an intersection is found, since we are traversing roots from earliest
161 // to latest time of impact
162 return bIsIntersection;
163 },
164 coeffs,
165 TScalar(0),
166 TScalar(1));
167 // Compute return value
168 r[0] = bIntersectionFound * r[0] + (not bIntersectionFound) * TScalar(-1);
169 return r;
170}
171
172namespace detail {
173
174template <
183 class TScalar>
184PBAT_HOST_DEVICE std::array<TScalar, 4> EdgeEdgeCcdUnivariatePolynomial(
185 TP1T const& P1T,
186 TQ1T const& Q1T,
187 TP2T const& P2T,
188 TQ2T const& Q2T,
189 TP1 const& P1,
190 TQ1 const& Q1,
191 TP2 const& P2,
192 TQ2 const& Q2)
193{
194 std::array<TScalar, 4> sigma;
195 TScalar const z0 = P1T[0] * P2T[1];
196 TScalar const z1 = P1T[0] * P2T[2];
197 TScalar const z2 = Q1T[1] * Q2T[2];
198 TScalar const z3 = P1T[1] * P2T[0];
199 TScalar const z4 = P1T[1] * P2T[2];
200 TScalar const z5 = Q1T[2] * Q2T[0];
201 TScalar const z6 = P1T[2] * P2T[0];
202 TScalar const z7 = P1T[2] * P2T[1];
203 TScalar const z8 = Q1T[0] * Q2T[1];
204 TScalar const z9 = Q1T[2] * Q2T[1];
205 TScalar const z10 = Q1T[0] * Q2T[2];
206 TScalar const z11 = Q1T[1] * Q2T[0];
207 TScalar const z12 =
208 z0 * Q1T[2] + z1 * Q2T[1] + z10 * P2T[1] + z11 * P2T[2] + z2 * P1T[0] + z3 * Q2T[2] +
209 z4 * Q1T[0] + z5 * P1T[1] + z6 * Q1T[1] + z7 * Q2T[0] + z8 * P1T[2] + z9 * P2T[0] -
210 P1T[0] * P2T[1] * Q2T[2] - P1T[0] * P2T[2] * Q1T[1] - P1T[0] * Q1T[2] * Q2T[1] -
211 P1T[1] * P2T[0] * Q1T[2] - P1T[1] * P2T[2] * Q2T[0] - P1T[1] * Q1T[0] * Q2T[2] -
212 P1T[2] * P2T[0] * Q2T[1] - P1T[2] * P2T[1] * Q1T[0] - P1T[2] * Q1T[1] * Q2T[0] -
213 P2T[0] * Q1T[1] * Q2T[2] - P2T[1] * Q1T[2] * Q2T[0] - P2T[2] * Q1T[0] * Q2T[1];
214 TScalar const z13 = P1[0] * P2T[1];
215 TScalar const z14 = z13 * Q1T[2];
216 TScalar const z15 = P1[0] * P2T[2];
217 TScalar const z16 = z15 * Q2T[1];
218 TScalar const z17 = z2 * P1[0];
219 TScalar const z18 = P1[1] * P2T[0];
220 TScalar const z19 = z18 * Q2T[2];
221 TScalar const z20 = P1[1] * P2T[2];
222 TScalar const z21 = z20 * Q1T[0];
223 TScalar const z22 = z5 * P1[1];
224 TScalar const z23 = P1[2] * P2T[0];
225 TScalar const z24 = z23 * Q1T[1];
226 TScalar const z25 = P1[2] * P2T[1];
227 TScalar const z26 = z25 * Q2T[0];
228 TScalar const z27 = z8 * P1[2];
229 TScalar const z28 = P1T[0] * P2[2];
230 TScalar const z29 = z28 * Q2T[1];
231 TScalar const z30 = z0 * Q1[2];
232 TScalar const z31 = Q1[1] * Q2T[2];
233 TScalar const z32 = z31 * P1T[0];
234 TScalar const z33 = P1T[1] * P2[0];
235 TScalar const z34 = z33 * Q2T[2];
236 TScalar const z35 = z4 * Q1[0];
237 TScalar const z36 = Q1[2] * Q2T[0];
238 TScalar const z37 = z36 * P1T[1];
239 TScalar const z38 = P1T[2] * P2[1];
240 TScalar const z39 = z38 * Q2T[0];
241 TScalar const z40 = z6 * Q1[1];
242 TScalar const z41 = Q1[0] * Q2T[1];
243 TScalar const z42 = z41 * P1T[2];
244 TScalar const z43 = z9 * P2[0];
245 TScalar const z44 = z10 * P2[1];
246 TScalar const z45 = z11 * P2[2];
247 TScalar const z46 = Q1[2] * Q2T[1];
248 TScalar const z47 = z46 * P2T[0];
249 TScalar const z48 = Q1[0] * Q2T[2];
250 TScalar const z49 = z48 * P2T[1];
251 TScalar const z50 = Q1[1] * Q2T[0];
252 TScalar const z51 = z50 * P2T[2];
253 TScalar const z52 = z13 * Q2T[2];
254 TScalar const z53 = z15 * Q1T[1];
255 TScalar const z54 = z9 * P1[0];
256 TScalar const z55 = z18 * Q1T[2];
257 TScalar const z56 = z20 * Q2T[0];
258 TScalar const z57 = z10 * P1[1];
259 TScalar const z58 = z23 * Q2T[1];
260 TScalar const z59 = z25 * Q1T[0];
261 TScalar const z60 = z11 * P1[2];
262 TScalar const z61 = P1T[0] * P2[1];
263 TScalar const z62 = z61 * Q2T[2];
264 TScalar const z63 = z1 * Q1[1];
265 TScalar const z64 = z46 * P1T[0];
266 TScalar const z65 = P1T[1] * P2[2];
267 TScalar const z66 = z65 * Q2T[0];
268 TScalar const z67 = z3 * Q1[2];
269 TScalar const z68 = z48 * P1T[1];
270 TScalar const z69 = P1T[2] * P2[0];
271 TScalar const z70 = z69 * Q2T[1];
272 TScalar const z71 = z7 * Q1[0];
273 TScalar const z72 = z50 * P1T[2];
274 TScalar const z73 = z2 * P2[0];
275 TScalar const z74 = z5 * P2[1];
276 TScalar const z75 = z8 * P2[2];
277 TScalar const z76 = z31 * P2T[0];
278 TScalar const z77 = z36 * P2T[1];
279 TScalar const z78 = z41 * P2T[2];
280 TScalar const z79 = Q1T[1] * Q2[2];
281 TScalar const z80 = Q1T[2] * Q2[0];
282 TScalar const z81 = Q1T[0] * Q2[1];
283 TScalar const z82 = Q1T[2] * Q2[1];
284 TScalar const z83 = Q1T[0] * Q2[2];
285 TScalar const z84 = Q1T[1] * Q2[0];
286 TScalar const z85 =
287 z1 * Q2[1] + z3 * Q2[2] + z61 * Q1T[2] + z65 * Q1T[0] + z69 * Q1T[1] + z7 * Q2[0] +
288 z79 * P1T[0] + z80 * P1T[1] + z81 * P1T[2] + z82 * P2T[0] + z83 * P2T[1] + z84 * P2T[2] -
289 P1T[0] * P2[2] * Q1T[1] - P1T[0] * P2T[1] * Q2[2] - P1T[0] * Q1T[2] * Q2[1] -
290 P1T[1] * P2[0] * Q1T[2] - P1T[1] * P2T[2] * Q2[0] - P1T[1] * Q1T[0] * Q2[2] -
291 P1T[2] * P2[1] * Q1T[0] - P1T[2] * P2T[0] * Q2[1] - P1T[2] * Q1T[1] * Q2[0] -
292 P2T[0] * Q1T[1] * Q2[2] - P2T[1] * Q1T[2] * Q2[0] - P2T[2] * Q1T[0] * Q2[1];
293 TScalar const z86 = P1[0] * P2[1];
294 TScalar const z87 = z86 * Q1T[2];
295 TScalar const z88 = P1[0] * P2[2];
296 TScalar const z89 = z15 * Q2[1];
297 TScalar const z90 = z79 * P1[0];
298 TScalar const z91 = P1[1] * P2[0];
299 TScalar const z92 = P1[1] * P2[2];
300 TScalar const z93 = z92 * Q1T[0];
301 TScalar const z94 = z18 * Q2[2];
302 TScalar const z95 = z80 * P1[1];
303 TScalar const z96 = P1[2] * P2[0];
304 TScalar const z97 = z96 * Q1T[1];
305 TScalar const z98 = P1[2] * P2[1];
306 TScalar const z99 = z25 * Q2[0];
307 TScalar const z100 = z81 * P1[2];
308 TScalar const z101 = z1 * P2[1];
309 TScalar const z102 = z61 * Q1[2];
310 TScalar const z103 = z28 * Q2[1];
311 TScalar const z104 = Q1[1] * Q2[2];
312 TScalar const z105 = z104 * P1T[0];
313 TScalar const z106 = z33 * Q2[2];
314 TScalar const z107 = z3 * P2[2];
315 TScalar const z108 = z65 * Q1[0];
316 TScalar const z109 = Q1[2] * Q2[0];
317 TScalar const z110 = z109 * P1T[1];
318 TScalar const z111 = z7 * P2[0];
319 TScalar const z112 = z69 * Q1[1];
320 TScalar const z113 = z38 * Q2[0];
321 TScalar const z114 = Q1[0] * Q2[1];
322 TScalar const z115 = z114 * P1T[2];
323 TScalar const z116 = P2[0] * P2T[2];
324 TScalar const z117 = z116 * Q1T[1];
325 TScalar const z118 = z82 * P2[0];
326 TScalar const z119 = P2[1] * P2T[0];
327 TScalar const z120 = z119 * Q1T[2];
328 TScalar const z121 = z83 * P2[1];
329 TScalar const z122 = P2[2] * P2T[1];
330 TScalar const z123 = z122 * Q1T[0];
331 TScalar const z124 = z84 * P2[2];
332 TScalar const z125 = Q1[2] * Q2[1];
333 TScalar const z126 = z125 * P2T[0];
334 TScalar const z127 = Q1[0] * Q2[2];
335 TScalar const z128 = z127 * P2T[1];
336 TScalar const z129 = Q1[1] * Q2[0];
337 TScalar const z130 = z129 * P2T[2];
338 TScalar const z131 = P2[2] * Q1T[1];
339 TScalar const z132 = z131 * P1[0];
340 TScalar const z133 = z13 * Q2[2];
341 TScalar const z134 = z82 * P1[0];
342 TScalar const z135 = P2[0] * Q1T[2];
343 TScalar const z136 = z135 * P1[1];
344 TScalar const z137 = z20 * Q2[0];
345 TScalar const z138 = z83 * P1[1];
346 TScalar const z139 = P2[1] * Q1T[0];
347 TScalar const z140 = z139 * P1[2];
348 TScalar const z141 = z23 * Q2[1];
349 TScalar const z142 = z84 * P1[2];
350 TScalar const z143 = z61 * Q2[2];
351 TScalar const z144 = z0 * P2[2];
352 TScalar const z145 = z28 * Q1[1];
353 TScalar const z146 = z125 * P1T[0];
354 TScalar const z147 = z4 * P2[0];
355 TScalar const z148 = z33 * Q1[2];
356 TScalar const z149 = z65 * Q2[0];
357 TScalar const z150 = z127 * P1T[1];
358 TScalar const z151 = z69 * Q2[1];
359 TScalar const z152 = z6 * P2[1];
360 TScalar const z153 = z38 * Q1[0];
361 TScalar const z154 = z129 * P1T[2];
362 TScalar const z155 = z135 * P2T[1];
363 TScalar const z156 = z79 * P2[0];
364 TScalar const z157 = z139 * P2T[2];
365 TScalar const z158 = z80 * P2[1];
366 TScalar const z159 = z131 * P2T[0];
367 TScalar const z160 = z81 * P2[2];
368 TScalar const z161 = z104 * P2T[0];
369 TScalar const z162 = z109 * P2T[1];
370 TScalar const z163 = z114 * P2T[2];
371 sigma[0] = -z12;
372 sigma[1] =
373 -2 * z0 * Q2T[2] - 2 * z1 * Q1T[1] - 2 * z10 * P1T[1] - 2 * z11 * P1T[2] - z14 - z16 - z17 -
374 z19 - 2 * z2 * P2T[0] - z21 - z22 - z24 - z26 - z27 - z29 - 2 * z3 * Q1T[2] - z30 - z32 -
375 z34 - z35 - z37 - z39 - 2 * z4 * Q2T[0] - z40 - z42 - z43 - z44 - z45 - z47 - z49 -
376 2 * z5 * P2T[1] - z51 + z52 + z53 + z54 + z55 + z56 + z57 + z58 + z59 - 2 * z6 * Q2T[1] +
377 z60 + z62 + z63 + z64 + z66 + z67 + z68 - 2 * z7 * Q1T[0] + z70 + z71 + z72 + z73 + z74 +
378 z75 + z76 + z77 + z78 - 2 * z8 * P2T[2] - z85 - 2 * z9 * P1T[0] +
379 2 * P1T[0] * P2T[1] * Q1T[2] + 2 * P1T[0] * P2T[2] * Q2T[1] + 2 * P1T[0] * Q1T[1] * Q2T[2] +
380 2 * P1T[1] * P2T[0] * Q2T[2] + 2 * P1T[1] * P2T[2] * Q1T[0] + 2 * P1T[1] * Q1T[2] * Q2T[0] +
381 2 * P1T[2] * P2T[0] * Q1T[1] + 2 * P1T[2] * P2T[1] * Q2T[0] + 2 * P1T[2] * Q1T[0] * Q2T[1] +
382 2 * P2T[0] * Q1T[2] * Q2T[1] + 2 * P2T[1] * Q1T[0] * Q2T[2] + 2 * P2T[2] * Q1T[1] * Q2T[0];
383 sigma[2] =
384 -2 * z0 * Q2[2] - z100 - z101 - z102 - z103 - z105 - z106 - z107 - z108 - z110 - z111 -
385 z112 - z113 - z115 - z117 - z118 - z12 - z120 - z121 - z123 - z124 - z126 - z128 -
386 z13 * Q1[2] - z130 + z132 + z133 + z134 + z136 + z137 + z138 + z14 + z140 + z141 + z142 +
387 z143 + z144 + z145 + z146 + z147 + z148 + z149 + z150 + z151 + z152 + z153 + z154 + z155 +
388 z156 + z157 + z158 + z159 + z16 + z160 + z161 + z162 + z163 + z17 + z19 - z20 * Q1[0] +
389 z21 + z22 - z23 * Q1[1] + z24 + z26 + z27 - 2 * z28 * Q1T[1] + z29 + z30 - z31 * P1[0] +
390 z32 - 2 * z33 * Q1T[2] + z34 + z35 - z36 * P1[1] + z37 - 2 * z38 * Q1T[0] + z39 -
391 2 * z4 * Q2[0] + z40 - z41 * P1[2] + z42 + z43 + z44 + z45 - z46 * P2[0] + z47 -
392 z48 * P2[1] + z49 - z50 * P2[2] + z51 - z52 - z53 - z54 - z55 - z56 - z57 - z58 - z59 -
393 2 * z6 * Q2[1] - z60 - z62 - z63 - z64 - z66 - z67 - z68 - z70 - z71 - z72 - z73 - z74 -
394 z75 - z76 - z77 - z78 - 2 * z79 * P2T[0] - 2 * z80 * P2T[1] - 2 * z81 * P2T[2] -
395 2 * z82 * P1T[0] - 2 * z83 * P1T[1] - 2 * z84 * P1T[2] - z87 - z88 * Q2T[1] - z89 - z90 -
396 z91 * Q2T[2] - z93 - z94 - z95 - z97 - z98 * Q2T[0] - z99 + P1[0] * P2[1] * Q2T[2] +
397 P1[0] * P2T[2] * Q1[1] + P1[0] * Q1[2] * Q2T[1] + P1[1] * P2[2] * Q2T[0] +
398 P1[1] * P2T[0] * Q1[2] + P1[1] * Q1[0] * Q2T[2] + P1[2] * P2[0] * Q2T[1] +
399 P1[2] * P2T[1] * Q1[0] + P1[2] * Q1[1] * Q2T[0] + 2 * P1T[0] * P2[1] * Q1T[2] +
400 2 * P1T[0] * P2T[2] * Q2[1] + 2 * P1T[0] * Q1T[1] * Q2[2] + 2 * P1T[1] * P2[2] * Q1T[0] +
401 2 * P1T[1] * P2T[0] * Q2[2] + 2 * P1T[1] * Q1T[2] * Q2[0] + 2 * P1T[2] * P2[0] * Q1T[1] +
402 2 * P1T[2] * P2T[1] * Q2[0] + 2 * P1T[2] * Q1T[0] * Q2[1] + P2[0] * Q1[1] * Q2T[2] +
403 P2[1] * Q1[2] * Q2T[0] + P2[2] * Q1[0] * Q2T[1] + 2 * P2T[0] * Q1T[2] * Q2[1] +
404 2 * P2T[1] * Q1T[0] * Q2[2] + 2 * P2T[2] * Q1T[1] * Q2[0];
405 sigma[3] = z100 + z101 + z102 + z103 - z104 * P1[0] + z105 + z106 + z107 + z108 - z109 * P1[1] +
406 z110 + z111 + z112 + z113 - z114 * P1[2] + z115 - z116 * Q1[1] + z117 + z118 -
407 z119 * Q1[2] + z120 + z121 - z122 * Q1[0] + z123 + z124 - z125 * P2[0] + z126 -
408 z127 * P2[1] + z128 - z129 * P2[2] + z130 - z132 - z133 - z134 - z136 - z137 - z138 -
409 z140 - z141 - z142 - z143 - z144 - z145 - z146 - z147 - z148 - z149 - z15 * P2[1] -
410 z150 - z151 - z152 - z153 - z154 - z155 - z156 - z157 - z158 - z159 - z160 - z161 -
411 z162 - z163 - z18 * P2[2] - z25 * P2[0] - z85 - z86 * Q1[2] + z87 - z88 * Q2[1] +
412 z89 + z90 - z91 * Q2[2] - z92 * Q1[0] + z93 + z94 + z95 - z96 * Q1[1] + z97 -
413 z98 * Q2[0] + z99 + P1[0] * P2[1] * Q2[2] + P1[0] * P2[2] * P2T[1] +
414 P1[0] * P2[2] * Q1[1] + P1[0] * Q1[2] * Q2[1] + P1[1] * P2[0] * P2T[2] +
415 P1[1] * P2[0] * Q1[2] + P1[1] * P2[2] * Q2[0] + P1[1] * Q1[0] * Q2[2] +
416 P1[2] * P2[0] * Q2[1] + P1[2] * P2[1] * P2T[0] + P1[2] * P2[1] * Q1[0] +
417 P1[2] * Q1[1] * Q2[0] + P2[0] * P2T[1] * Q1[2] + P2[0] * Q1[1] * Q2[2] +
418 P2[1] * P2T[2] * Q1[0] + P2[1] * Q1[2] * Q2[0] + P2[2] * P2T[0] * Q1[1] +
419 P2[2] * Q1[0] * Q2[1];
420 return sigma;
421}
422
423} // namespace detail
424
425} // namespace pbat::geometry
426
427#endif // PBAT_GEOMETRY_EDGEEDGECCD_H
This file contains functions to answer closest point queries.
PBAT_HOST_DEVICE std::array< TScalar, 4 > EdgeEdgeCcdUnivariatePolynomial(TP1T const &P1T, TQ1T const &Q1T, TP2T const &P2T, TQ2T const &Q2T, TP1 const &P1, TQ1 const &Q1, TP2 const &P2, TQ2 const &Q2)
Computes the univariate linearly swept edge-edge co-planarity polynomial.
Definition EdgeEdgeCcd.h:184
Root-finders for polynomial of arbitrary degree.
PBAT_HOST_DEVICE auto Lines(TMatrixP1 const &P1, TMatrixQ1 const &Q1, TMatrixP2 const &P2, TMatrixQ2 const &Q2, TScalar eps=std::numeric_limits< TScalar >::min()) -> mini::SVector< TScalar, 2 >
Find closest points on two lines defined by points P1, Q1 and P2, Q2.
Definition ClosestPointQueries.h:448
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
PBAT_HOST_DEVICE auto EdgeEdgeCcd(TP1T const &P1T, TQ1T const &Q1T, TP2T const &P2T, TQ2T const &Q2T, TP1 const &P1, TQ1 const &Q1, TP2 const &P2, TQ2 const &Q2) -> math::linalg::mini::SVector< TScalar, 3 >
Computes the time of impact and barycentric coordinates of the intersection point between an edge ...
Definition EdgeEdgeCcd.h:127
Mini linear algebra related functionality.
Definition Assign.h:12
bool ForEachRoot(FOnRoot &&fOnRoot, std::array< TScalar, N+1 > const &coeffs, TScalar min=std::numeric_limits< TScalar >::lowest(), TScalar max=std::numeric_limits< TScalar >::max())
Computes the each real root of a degree N polynomial in the range [min,max] in increasing order.
Definition Roots.h:3153