135 TQ2
const& Q2) -> math::linalg::mini::SVector<TScalar, 3>
137 auto constexpr kDims = TP1T::kRows;
139 std::array<TScalar, 4>
const coeffs =
143 SVector<TScalar, 3> r;
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();
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];
162 return bIsIntersection;
168 r[0] = bIntersectionFound * r[0] + (not bIntersectionFound) * TScalar(-1);
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];
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];
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];
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];
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];
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
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
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