38 #ifndef FCL_BV_RSS_INL_H
39 #define FCL_BV_RSS_INL_H
79 const Matrix3<double>& Rab,
80 const Vector3<double>& Tab,
89 const Transform3<double>& tfab,
100 template <
typename S>
108 template <
typename S>
113 axis.col(0).dot(t), axis.col(1).dot(t), axis.col(2).dot(t));
117 return (dist <= (
r + other.
r));
121 template <
typename S>
129 template <
typename S>
134 axis.col(0).dot(local_p),
135 axis.col(1).dot(local_p),
136 axis.col(2).dot(local_p));
137 S abs_proj2 = fabs(proj[2]);
140 if((proj[0] < l[0]) && (proj[0] > 0) && (proj[1] < l[1]) && (proj[1] > 0))
142 return (abs_proj2 <
r);
144 else if((proj[0] < l[0]) && (proj[0] > 0) && ((proj[1] < 0) || (proj[1] > l[1])))
146 S y = (proj[1] > 0) ? l[1] : 0;
148 return ((proj - v).squaredNorm() <
r *
r);
150 else if((proj[1] < l[1]) && (proj[1] > 0) && ((proj[0] < 0) || (proj[0] > l[0])))
152 S x = (proj[0] > 0) ? l[0] : 0;
154 return ((proj - v).squaredNorm() <
r *
r);
158 S x = (proj[0] > 0) ? l[0] : 0;
159 S y = (proj[1] > 0) ? l[1] : 0;
161 return ((proj - v).squaredNorm() <
r *
r);
166 template <
typename S>
172 axis.col(0).dot(local_p),
173 axis.col(1).dot(local_p),
174 axis.col(2).dot(local_p));
175 S abs_proj2 = fabs(proj[2]);
178 if((proj[0] < l[0]) && (proj[0] > 0) && (proj[1] < l[1]) && (proj[1] > 0))
184 r = 0.5 * (
r + abs_proj2);
187 To[2] += 0.5 * (abs_proj2 -
r);
189 To[2] -= 0.5 * (abs_proj2 -
r);
192 else if((proj[0] < l[0]) && (proj[0] > 0) && ((proj[1] < 0) || (proj[1] > l[1])))
194 S y = (proj[1] > 0) ? l[1] : 0;
196 S new_r_sqr = (proj - v).squaredNorm();
197 if(new_r_sqr <
r *
r)
203 S delta_y = - std::sqrt(
r *
r - proj[2] * proj[2]) + fabs(proj[1] - y);
210 S delta_y = fabs(proj[1] - y);
216 To[2] += 0.5 * (abs_proj2 -
r);
218 To[2] -= 0.5 * (abs_proj2 -
r);
222 else if((proj[1] < l[1]) && (proj[1] > 0) && ((proj[0] < 0) || (proj[0] > l[0])))
224 S x = (proj[0] > 0) ? l[0] : 0;
226 S new_r_sqr = (proj - v).squaredNorm();
227 if(new_r_sqr <
r *
r)
233 S delta_x = - std::sqrt(
r *
r - proj[2] * proj[2]) + fabs(proj[0] - x);
240 S delta_x = fabs(proj[0] - x);
246 To[2] += 0.5 * (abs_proj2 -
r);
248 To[2] -= 0.5 * (abs_proj2 -
r);
254 S x = (proj[0] > 0) ? l[0] : 0;
255 S y = (proj[1] > 0) ? l[1] : 0;
257 S new_r_sqr = (proj - v).squaredNorm();
258 if(new_r_sqr <
r *
r)
264 S diag = std::sqrt(new_r_sqr - proj[2] * proj[2]);
265 S delta_diag = - std::sqrt(
r *
r - proj[2] * proj[2]) + diag;
267 S delta_x = delta_diag / diag * fabs(proj[0] - x);
268 S delta_y = delta_diag / diag * fabs(proj[1] - y);
272 if(proj[0] < 0 && proj[1] < 0)
280 S delta_x = fabs(proj[0] - x);
281 S delta_y = fabs(proj[1] - y);
286 if(proj[0] < 0 && proj[1] < 0)
293 To[2] += 0.5 * (abs_proj2 -
r);
295 To[2] -= 0.5 * (abs_proj2 -
r);
304 template <
typename S>
307 *
this = *
this + other;
312 template <
typename S>
328 v[0] = other.
To + d0_pos + d1_pos + d2_pos;
329 v[1] = other.
To + d0_pos + d1_pos + d2_neg;
330 v[2] = other.
To + d0_pos + d1_neg + d2_pos;
331 v[3] = other.
To + d0_pos + d1_neg + d2_neg;
332 v[4] = other.
To + d0_neg + d1_pos + d2_pos;
333 v[5] = other.
To + d0_neg + d1_pos + d2_neg;
334 v[6] = other.
To + d0_neg + d1_neg + d2_pos;
335 v[7] = other.
To + d0_neg + d1_neg + d2_neg;
337 d0_pos.noalias() = axis.col(0) * (l[0] +
r);
338 d1_pos.noalias() = axis.col(1) * (l[1] +
r);
339 d0_neg.noalias() = axis.col(0) * (-
r);
340 d1_neg.noalias() = axis.col(1) * (-
r);
341 d2_pos.noalias() = axis.col(2) *
r;
342 d2_neg.noalias() = axis.col(2) * (-
r);
344 v[8] = To + d0_pos + d1_pos + d2_pos;
345 v[9] = To + d0_pos + d1_pos + d2_neg;
346 v[10] = To + d0_pos + d1_neg + d2_pos;
347 v[11] = To + d0_pos + d1_neg + d2_neg;
348 v[12] = To + d0_neg + d1_pos + d2_pos;
349 v[13] = To + d0_neg + d1_pos + d2_neg;
350 v[14] = To + d0_neg + d1_neg + d2_pos;
351 v[15] = To + d0_neg + d1_neg + d2_neg;
358 getCovariance<S>(v,
nullptr,
nullptr,
nullptr, 16, M);
362 if(s[0] > s[1]) {
max = 0;
min = 1; }
363 else {
min = 0;
max = 1; }
364 if(s[2] < s[
min]) { mid =
min;
min = 2; }
365 else if(s[2] > s[
max]) { mid =
max;
max = 2; }
370 bv.
axis.col(1) = E.col(mid);
371 bv.
axis.col(2).noalias() = axis.col(0).cross(axis.col(1));
374 getRadiusAndOriginAndRectangleSize<S>(v,
nullptr,
nullptr,
nullptr, 16, bv.
axis, bv.
To, bv.
l, bv.
r);
380 template <
typename S>
387 template <
typename S>
394 template <
typename S>
401 template <
typename S>
408 template <
typename S>
411 return (std::sqrt(l[0] * l[0] + l[1] * l[1]) + 2 *
r);
415 template <
typename S>
419 p_ToCenter_T << l[0] * 0.5, l[1] * 0.5, 0.0;
420 return p_FoTo_F() + R_FT() * p_ToCenter_T;
423 template <
typename S>
427 p_ToCenter_T << l[0] * 0.5, l[1] * 0.5, 0.0;
428 p_FoTo_F() = p_FoCenter_F - R_FT() * p_ToCenter_T;
432 template <
typename S>
440 axis.col(0).dot(t), axis.col(1).dot(t), axis.col(2).dot(t));
444 dist -= (
r + other.
r);
445 return (dist < (
S)0.0) ? (
S)0.0 : dist;
449 template <
typename S>
453 else if(val > b) val = b;
457 template <
typename S>
458 void segCoords(S& t, S& u, S a, S b, S A_dot_B, S A_dot_T, S B_dot_T)
460 S denom = 1 - A_dot_B * A_dot_B;
462 if(denom == 0) t = 0;
465 t = (A_dot_T - B_dot_T * A_dot_B) / denom;
469 u = t * A_dot_B - B_dot_T;
479 t = u * A_dot_B + A_dot_T;
485 template <
typename S>
486 bool inVoronoi(S a, S b, S Anorm_dot_B, S Anorm_dot_T, S A_dot_B, S A_dot_T, S B_dot_T)
488 if(fabs(Anorm_dot_B) < 1e-7)
return false;
492 u = -Anorm_dot_T / Anorm_dot_B;
495 t = u * A_dot_B + A_dot_T;
498 v = t * A_dot_B - B_dot_T;
502 if(v > (u + 1e-7))
return true;
506 if(v < (u - 1e-7))
return true;
512 template <
typename S>
515 S A0_dot_B0, A0_dot_B1, A1_dot_B0, A1_dot_B1;
517 A0_dot_B0 = Rab(0, 0);
518 A0_dot_B1 = Rab(0, 1);
519 A1_dot_B0 = Rab(1, 0);
520 A1_dot_B1 = Rab(1, 1);
522 S aA0_dot_B0, aA0_dot_B1, aA1_dot_B0, aA1_dot_B1;
523 S bA0_dot_B0, bA0_dot_B1, bA1_dot_B0, bA1_dot_B1;
525 aA0_dot_B0 = a[0] * A0_dot_B0;
526 aA0_dot_B1 = a[0] * A0_dot_B1;
527 aA1_dot_B0 = a[1] * A1_dot_B0;
528 aA1_dot_B1 = a[1] * A1_dot_B1;
529 bA0_dot_B0 = b[0] * A0_dot_B0;
530 bA1_dot_B0 = b[0] * A1_dot_B0;
531 bA0_dot_B1 = b[1] * A0_dot_B1;
532 bA1_dot_B1 = b[1] * A1_dot_B1;
541 S ALL_x, ALU_x, AUL_x, AUU_x;
542 S BLL_x, BLU_x, BUL_x, BUU_x;
543 S LA1_lx, LA1_ux, UA1_lx, UA1_ux, LB1_lx, LB1_ux, UB1_lx, UB1_ux;
546 ALU_x = ALL_x + aA1_dot_B0;
547 AUL_x = ALL_x + aA0_dot_B0;
548 AUU_x = ALU_x + aA0_dot_B0;
566 BLU_x = BLL_x + bA0_dot_B1;
567 BUL_x = BLL_x + bA0_dot_B0;
568 BUU_x = BLU_x + bA0_dot_B0;
587 if((UA1_ux > b[0]) && (UB1_ux > a[0]))
589 if(((UA1_lx > b[0]) ||
590 inVoronoi(b[1], a[1], A1_dot_B0, aA0_dot_B0 - b[0] - Tba[0],
591 A1_dot_B1, aA0_dot_B1 - Tba[1],
592 -Tab[1] - bA1_dot_B0))
595 inVoronoi(a[1], b[1], A0_dot_B1, Tab[0] + bA0_dot_B0 - a[0],
596 A1_dot_B1, Tab[1] + bA1_dot_B0, Tba[1] - aA0_dot_B1)))
598 segCoords(t, u, a[1], b[1], A1_dot_B1, Tab[1] + bA1_dot_B0,
599 Tba[1] - aA0_dot_B1);
601 D[0] = Tab[0] + Rab(0, 0) * b[0] + Rab(0, 1) * u - a[0] ;
602 D[1] = Tab[1] + Rab(1, 0) * b[0] + Rab(1, 1) * u - t;
603 D[2] = Tab[2] + Rab(2, 0) * b[0] + Rab(2, 1) * u;
618 if((UA1_lx < 0) && (LB1_ux > a[0]))
621 inVoronoi(b[1], a[1], -A1_dot_B0, Tba[0] - aA0_dot_B0,
622 A1_dot_B1, aA0_dot_B1 - Tba[1], -Tab[1]))
625 inVoronoi(a[1], b[1], A0_dot_B1, Tab[0] - a[0],
626 A1_dot_B1, Tab[1], Tba[1] - aA0_dot_B1)))
628 segCoords(t, u, a[1], b[1], A1_dot_B1, Tab[1], Tba[1] - aA0_dot_B1);
630 D[0] = Tab[0] + Rab(0, 1) * u - a[0];
631 D[1] = Tab[1] + Rab(1, 1) * u - t;
632 D[2] = Tab[2] + Rab(2, 1) * u;
646 if((LA1_ux > b[0]) && (UB1_lx < 0))
648 if(((LA1_lx > b[0]) ||
649 inVoronoi(b[1], a[1], A1_dot_B0, -Tba[0] - b[0],
650 A1_dot_B1, -Tba[1], -Tab[1] - bA1_dot_B0))
653 inVoronoi(a[1], b[1], -A0_dot_B1, -Tab[0] - bA0_dot_B0,
654 A1_dot_B1, Tab[1] + bA1_dot_B0, Tba[1])))
656 segCoords(t, u, a[1], b[1], A1_dot_B1, Tab[1] + bA1_dot_B0, Tba[1]);
658 D[0] = Tab[0] + Rab(0, 0) * b[0] + Rab(0, 1) * u;
659 D[1] = Tab[1] + Rab(1, 0) * b[0] + Rab(1, 1) * u - t;
660 D[2] = Tab[2] + Rab(2, 0) * b[0] + Rab(2, 1) * u;
674 if((LA1_lx < 0) && (LB1_lx < 0))
677 inVoronoi(b[1], a[1], -A1_dot_B0, Tba[0], A1_dot_B1,
681 inVoronoi(a[1], b[1], -A0_dot_B1, -Tab[0], A1_dot_B1,
684 segCoords(t, u, a[1], b[1], A1_dot_B1, Tab[1], Tba[1]);
686 D[0] = Tab[0] + Rab(0, 1) * u;
687 D[1] = Tab[1] + Rab(1, 1) * u - t;
688 D[2] = Tab[2] + Rab(2, 1) * u;
700 S ALL_y, ALU_y, AUL_y, AUU_y;
703 ALU_y = ALL_y + aA1_dot_B1;
704 AUL_y = ALL_y + aA0_dot_B1;
705 AUU_y = ALU_y + aA0_dot_B1;
707 S LA1_ly, LA1_uy, UA1_ly, UA1_uy, LB0_lx, LB0_ux, UB0_lx, UB0_ux;
741 if((UA1_uy > b[1]) && (UB0_ux > a[0]))
743 if(((UA1_ly > b[1]) ||
744 inVoronoi(b[0], a[1], A1_dot_B1, aA0_dot_B1 - Tba[1] - b[1],
745 A1_dot_B0, aA0_dot_B0 - Tba[0], -Tab[1] - bA1_dot_B1))
748 inVoronoi(a[1], b[0], A0_dot_B0, Tab[0] - a[0] + bA0_dot_B1,
749 A1_dot_B0, Tab[1] + bA1_dot_B1, Tba[0] - aA0_dot_B0)))
751 segCoords(t, u, a[1], b[0], A1_dot_B0, Tab[1] + bA1_dot_B1,
752 Tba[0] - aA0_dot_B0);
754 D[0] = Tab[0] + Rab(0, 1) * b[1] + Rab(0, 0) * u - a[0] ;
755 D[1] = Tab[1] + Rab(1, 1) * b[1] + Rab(1, 0) * u - t;
756 D[2] = Tab[2] + Rab(2, 1) * b[1] + Rab(2, 0) * u;
770 if((UA1_ly < 0) && (LB0_ux > a[0]))
773 inVoronoi(b[0], a[1], -A1_dot_B1, Tba[1] - aA0_dot_B1, A1_dot_B0,
774 aA0_dot_B0 - Tba[0], -Tab[1]))
777 inVoronoi(a[1], b[0], A0_dot_B0, Tab[0] - a[0],
778 A1_dot_B0, Tab[1], Tba[0] - aA0_dot_B0)))
780 segCoords(t, u, a[1], b[0], A1_dot_B0, Tab[1], Tba[0] - aA0_dot_B0);
782 D[0] = Tab[0] + Rab(0, 0) * u - a[0];
783 D[1] = Tab[1] + Rab(1, 0) * u - t;
784 D[2] = Tab[2] + Rab(2, 0) * u;
798 if((LA1_uy > b[1]) && (UB0_lx < 0))
800 if(((LA1_ly > b[1]) ||
801 inVoronoi(b[0], a[1], A1_dot_B1, -Tba[1] - b[1],
802 A1_dot_B0, -Tba[0], -Tab[1] - bA1_dot_B1))
806 inVoronoi(a[1], b[0], -A0_dot_B0, -Tab[0] - bA0_dot_B1, A1_dot_B0,
807 Tab[1] + bA1_dot_B1, Tba[0])))
809 segCoords(t, u, a[1], b[0], A1_dot_B0, Tab[1] + bA1_dot_B1, Tba[0]);
811 D[0] = Tab[0] + Rab(0, 1) * b[1] + Rab(0, 0) * u;
812 D[1] = Tab[1] + Rab(1, 1) * b[1] + Rab(1, 0) * u - t;
813 D[2] = Tab[2] + Rab(2, 1) * b[1] + Rab(2, 0) * u;
828 if((LA1_ly < 0) && (LB0_lx < 0))
831 inVoronoi(b[0], a[1], -A1_dot_B1, Tba[1], A1_dot_B0,
835 inVoronoi(a[1], b[0], -A0_dot_B0, -Tab[0], A1_dot_B0,
838 segCoords(t, u, a[1], b[0], A1_dot_B0, Tab[1], Tba[0]);
840 D[0] = Tab[0] + Rab(0, 0) * u;
841 D[1] = Tab[1] + Rab(1, 0) * u - t;
842 D[2] = Tab[2] + Rab(2, 0) * u;
854 S BLL_y, BLU_y, BUL_y, BUU_y;
857 BLU_y = BLL_y + bA1_dot_B1;
858 BUL_y = BLL_y + bA1_dot_B0;
859 BUU_y = BLU_y + bA1_dot_B0;
861 S LA0_lx, LA0_ux, UA0_lx, UA0_ux, LB1_ly, LB1_uy, UB1_ly, UB1_uy;
895 if((UA0_ux > b[0]) && (UB1_uy > a[1]))
897 if(((UA0_lx > b[0]) ||
898 inVoronoi(b[1], a[0], A0_dot_B0, aA1_dot_B0 - Tba[0] - b[0],
899 A0_dot_B1, aA1_dot_B1 - Tba[1], -Tab[0] - bA0_dot_B0))
902 inVoronoi(a[0], b[1], A1_dot_B1, Tab[1] - a[1] + bA1_dot_B0,
903 A0_dot_B1, Tab[0] + bA0_dot_B0, Tba[1] - aA1_dot_B1)))
905 segCoords(t, u, a[0], b[1], A0_dot_B1, Tab[0] + bA0_dot_B0,
906 Tba[1] - aA1_dot_B1);
908 D[0] = Tab[0] + Rab(0, 0) * b[0] + Rab(0, 1) * u - t;
909 D[1] = Tab[1] + Rab(1, 0) * b[0] + Rab(1, 1) * u - a[1];
910 D[2] = Tab[2] + Rab(2, 0) * b[0] + Rab(2, 1) * u;
924 if((UA0_lx < 0) && (LB1_uy > a[1]))
927 inVoronoi(b[1], a[0], -A0_dot_B0, Tba[0] - aA1_dot_B0, A0_dot_B1,
928 aA1_dot_B1 - Tba[1], -Tab[0]))
931 inVoronoi(a[0], b[1], A1_dot_B1, Tab[1] - a[1], A0_dot_B1, Tab[0],
932 Tba[1] - aA1_dot_B1)))
934 segCoords(t, u, a[0], b[1], A0_dot_B1, Tab[0], Tba[1] - aA1_dot_B1);
936 D[0] = Tab[0] + Rab(0, 1) * u - t;
937 D[1] = Tab[1] + Rab(1, 1) * u - a[1];
938 D[2] = Tab[2] + Rab(2, 1) * u;
952 if((LA0_ux > b[0]) && (UB1_ly < 0))
954 if(((LA0_lx > b[0]) ||
955 inVoronoi(b[1], a[0], A0_dot_B0, -b[0] - Tba[0], A0_dot_B1, -Tba[1],
956 -bA0_dot_B0 - Tab[0]))
959 inVoronoi(a[0], b[1], -A1_dot_B1, -Tab[1] - bA1_dot_B0, A0_dot_B1,
960 Tab[0] + bA0_dot_B0, Tba[1])))
962 segCoords(t, u, a[0], b[1], A0_dot_B1, Tab[0] + bA0_dot_B0, Tba[1]);
964 D[0] = Tab[0] + Rab(0, 0) * b[0] + Rab(0, 1) * u - t;
965 D[1] = Tab[1] + Rab(1, 0) * b[0] + Rab(1, 1) * u;
966 D[2] = Tab[2] + Rab(2, 0) * b[0] + Rab(2, 1) * u;
980 if((LA0_lx < 0) && (LB1_ly < 0))
983 inVoronoi(b[1], a[0], -A0_dot_B0, Tba[0], A0_dot_B1, -Tba[1],
987 inVoronoi(a[0], b[1], -A1_dot_B1, -Tab[1], A0_dot_B1,
990 segCoords(t, u, a[0], b[1], A0_dot_B1, Tab[0], Tba[1]);
992 D[0] = Tab[0] + Rab(0, 1) * u - t;
993 D[1] = Tab[1] + Rab(1, 1) * u;
994 D[2] = Tab[2] + Rab(2, 1) * u;
1006 S LA0_ly, LA0_uy, UA0_ly, UA0_uy, LB0_ly, LB0_uy, UB0_ly, UB0_uy;
1040 if((UA0_uy > b[1]) && (UB0_uy > a[1]))
1042 if(((UA0_ly > b[1]) ||
1043 inVoronoi(b[0], a[0], A0_dot_B1, aA1_dot_B1 - Tba[1] - b[1],
1044 A0_dot_B0, aA1_dot_B0 - Tba[0], -Tab[0] - bA0_dot_B1))
1047 inVoronoi(a[0], b[0], A1_dot_B0, Tab[1] - a[1] + bA1_dot_B1, A0_dot_B0,
1048 Tab[0] + bA0_dot_B1, Tba[0] - aA1_dot_B0)))
1050 segCoords(t, u, a[0], b[0], A0_dot_B0, Tab[0] + bA0_dot_B1,
1051 Tba[0] - aA1_dot_B0);
1053 D[0] = Tab[0] + Rab(0, 1) * b[1] + Rab(0, 0) * u - t;
1054 D[1] = Tab[1] + Rab(1, 1) * b[1] + Rab(1, 0) * u - a[1];
1055 D[2] = Tab[2] + Rab(2, 1) * b[1] + Rab(2, 0) * u;
1069 if((UA0_ly < 0) && (LB0_uy > a[1]))
1072 inVoronoi(b[0], a[0], -A0_dot_B1, Tba[1] - aA1_dot_B1, A0_dot_B0,
1073 aA1_dot_B0 - Tba[0], -Tab[0]))
1076 inVoronoi(a[0], b[0], A1_dot_B0, Tab[1] - a[1],
1077 A0_dot_B0, Tab[0], Tba[0] - aA1_dot_B0)))
1079 segCoords(t, u, a[0], b[0], A0_dot_B0, Tab[0], Tba[0] - aA1_dot_B0);
1081 D[0] = Tab[0] + Rab(0, 0) * u - t;
1082 D[1] = Tab[1] + Rab(1, 0) * u - a[1];
1083 D[2] = Tab[2] + Rab(2, 0) * u;
1097 if((LA0_uy > b[1]) && (UB0_ly < 0))
1099 if(((LA0_ly > b[1]) ||
1100 inVoronoi(b[0], a[0], A0_dot_B1, -Tba[1] - b[1], A0_dot_B0, -Tba[0],
1101 -Tab[0] - bA0_dot_B1))
1105 inVoronoi(a[0], b[0], -A1_dot_B0, -Tab[1] - bA1_dot_B1, A0_dot_B0,
1106 Tab[0] + bA0_dot_B1, Tba[0])))
1108 segCoords(t, u, a[0], b[0], A0_dot_B0, Tab[0] + bA0_dot_B1, Tba[0]);
1110 D[0] = Tab[0] + Rab(0, 1) * b[1] + Rab(0, 0) * u - t;
1111 D[1] = Tab[1] + Rab(1, 1) * b[1] + Rab(1, 0) * u;
1112 D[2] = Tab[2] + Rab(2, 1) * b[1] + Rab(2, 0) * u;
1126 if((LA0_ly < 0) && (LB0_ly < 0))
1129 inVoronoi(b[0], a[0], -A0_dot_B1, Tba[1], A0_dot_B0,
1133 inVoronoi(a[0], b[0], -A1_dot_B0, -Tab[1], A0_dot_B0,
1136 segCoords(t, u, a[0], b[0], A0_dot_B0, Tab[0], Tba[0]);
1138 D[0] = Tab[0] + Rab(0, 0) * u - t;
1139 D[1] = Tab[1] + Rab(1, 0) * u;
1140 D[2] = Tab[2] + Rab(2, 0) * u;
1159 if (Rab(2, 0) < 0.0) sep1 += b[0] * Rab(2, 0);
1160 if (Rab(2, 1) < 0.0) sep1 += b[1] * Rab(2, 1);
1165 if (Rab(2, 0) > 0.0) sep1 -= b[0] * Rab(2, 0);
1166 if (Rab(2, 1) > 0.0) sep1 -= b[1] * Rab(2, 1);
1172 if (Rab(0, 2) < 0.0) sep2 += a[0] * Rab(0, 2);
1173 if (Rab(1, 2) < 0.0) sep2 += a[1] * Rab(1, 2);
1178 if (Rab(0, 2) > 0.0) sep2 -= a[0] * Rab(0, 2);
1179 if (Rab(1, 2) > 0.0) sep2 -= a[1] * Rab(1, 2);
1182 if(sep1 >= sep2 && sep1 >= 0)
1196 if(sep2 >= sep1 && sep2 >= 0)
1202 P_[0] = Rab(0, 2) * sep2 + Tab[0];
1203 P_[1] = Rab(1, 2) * sep2 + Tab[1];
1204 P_[2] = Rab(2, 2) * sep2 + Tab[2];
1208 P_[0] = -Rab(0, 2) * sep2 + Tab[0];
1209 P_[1] = -Rab(1, 2) * sep2 + Tab[1];
1210 P_[2] = -Rab(2, 2) * sep2 + Tab[2];
1222 S sep = (sep1 > sep2 ? sep1 : sep2);
1223 return (sep > 0 ? sep : 0);
1227 template <
typename S>
1235 S A0_dot_B0 = tfab.linear()(0, 0);
1236 S A0_dot_B1 = tfab.linear()(0, 1);
1237 S A1_dot_B0 = tfab.linear()(1, 0);
1238 S A1_dot_B1 = tfab.linear()(1, 1);
1240 S aA0_dot_B0 = a[0] * A0_dot_B0;
1241 S aA0_dot_B1 = a[0] * A0_dot_B1;
1242 S aA1_dot_B0 = a[1] * A1_dot_B0;
1243 S aA1_dot_B1 = a[1] * A1_dot_B1;
1244 S bA0_dot_B0 = b[0] * A0_dot_B0;
1245 S bA1_dot_B0 = b[0] * A1_dot_B0;
1246 S bA0_dot_B1 = b[1] * A0_dot_B1;
1247 S bA1_dot_B1 = b[1] * A1_dot_B1;
1249 Vector3<S> Tba = tfab.linear().transpose() * tfab.translation();
1256 S LA1_lx, LA1_ux, UA1_lx, UA1_ux, LB1_lx, LB1_ux, UB1_lx, UB1_ux;
1259 S ALU_x = ALL_x + aA1_dot_B0;
1260 S AUL_x = ALL_x + aA0_dot_B0;
1261 S AUU_x = ALU_x + aA0_dot_B0;
1278 S BLL_x = tfab.translation()[0];
1279 S BLU_x = BLL_x + bA0_dot_B1;
1280 S BUL_x = BLL_x + bA0_dot_B0;
1281 S BUU_x = BLU_x + bA0_dot_B0;
1300 if((UA1_ux > b[0]) && (UB1_ux > a[0]))
1302 if(((UA1_lx > b[0]) ||
1303 inVoronoi(b[1], a[1], A1_dot_B0, aA0_dot_B0 - b[0] - Tba[0],
1304 A1_dot_B1, aA0_dot_B1 - Tba[1],
1305 -tfab.translation()[1] - bA1_dot_B0))
1308 inVoronoi(a[1], b[1], A0_dot_B1, tfab.translation()[0] + bA0_dot_B0 - a[0],
1309 A1_dot_B1, tfab.translation()[1] + bA1_dot_B0, Tba[1] - aA0_dot_B1)))
1311 segCoords(t, u, a[1], b[1], A1_dot_B1, tfab.translation()[1] + bA1_dot_B0,
1312 Tba[1] - aA0_dot_B1);
1314 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * b[0] + tfab.linear()(0, 1) * u - a[0] ;
1315 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * b[0] + tfab.linear()(1, 1) * u - t;
1316 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * b[0] + tfab.linear()(2, 1) * u;
1331 if((UA1_lx < 0) && (LB1_ux > a[0]))
1334 inVoronoi(b[1], a[1], -A1_dot_B0, Tba[0] - aA0_dot_B0,
1335 A1_dot_B1, aA0_dot_B1 - Tba[1], -tfab.translation()[1]))
1338 inVoronoi(a[1], b[1], A0_dot_B1, tfab.translation()[0] - a[0],
1339 A1_dot_B1, tfab.translation()[1], Tba[1] - aA0_dot_B1)))
1341 segCoords(t, u, a[1], b[1], A1_dot_B1, tfab.translation()[1], Tba[1] - aA0_dot_B1);
1343 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * u - a[0];
1344 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * u - t;
1345 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * u;
1359 if((LA1_ux > b[0]) && (UB1_lx < 0))
1361 if(((LA1_lx > b[0]) ||
1362 inVoronoi(b[1], a[1], A1_dot_B0, -Tba[0] - b[0],
1363 A1_dot_B1, -Tba[1], -tfab.translation()[1] - bA1_dot_B0))
1366 inVoronoi(a[1], b[1], -A0_dot_B1, -tfab.translation()[0] - bA0_dot_B0,
1367 A1_dot_B1, tfab.translation()[1] + bA1_dot_B0, Tba[1])))
1369 segCoords(t, u, a[1], b[1], A1_dot_B1, tfab.translation()[1] + bA1_dot_B0, Tba[1]);
1371 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * b[0] + tfab.linear()(0, 1) * u;
1372 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * b[0] + tfab.linear()(1, 1) * u - t;
1373 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * b[0] + tfab.linear()(2, 1) * u;
1387 if((LA1_lx < 0) && (LB1_lx < 0))
1389 if (((LA1_ux < 0) ||
1390 inVoronoi(b[1], a[1], -A1_dot_B0, Tba[0], A1_dot_B1,
1391 -Tba[1], -tfab.translation()[1]))
1394 inVoronoi(a[1], b[1], -A0_dot_B1, -tfab.translation()[0], A1_dot_B1,
1395 tfab.translation()[1], Tba[1])))
1397 segCoords(t, u, a[1], b[1], A1_dot_B1, tfab.translation()[1], Tba[1]);
1399 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * u;
1400 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * u - t;
1401 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * u;
1413 S ALL_y, ALU_y, AUL_y, AUU_y;
1416 ALU_y = ALL_y + aA1_dot_B1;
1417 AUL_y = ALL_y + aA0_dot_B1;
1418 AUU_y = ALU_y + aA0_dot_B1;
1420 S LA1_ly, LA1_uy, UA1_ly, UA1_uy, LB0_lx, LB0_ux, UB0_lx, UB0_ux;
1454 if((UA1_uy > b[1]) && (UB0_ux > a[0]))
1456 if(((UA1_ly > b[1]) ||
1457 inVoronoi(b[0], a[1], A1_dot_B1, aA0_dot_B1 - Tba[1] - b[1],
1458 A1_dot_B0, aA0_dot_B0 - Tba[0], -tfab.translation()[1] - bA1_dot_B1))
1461 inVoronoi(a[1], b[0], A0_dot_B0, tfab.translation()[0] - a[0] + bA0_dot_B1,
1462 A1_dot_B0, tfab.translation()[1] + bA1_dot_B1, Tba[0] - aA0_dot_B0)))
1464 segCoords(t, u, a[1], b[0], A1_dot_B0, tfab.translation()[1] + bA1_dot_B1,
1465 Tba[0] - aA0_dot_B0);
1467 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * b[1] + tfab.linear()(0, 0) * u - a[0] ;
1468 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * b[1] + tfab.linear()(1, 0) * u - t;
1469 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * b[1] + tfab.linear()(2, 0) * u;
1483 if((UA1_ly < 0) && (LB0_ux > a[0]))
1486 inVoronoi(b[0], a[1], -A1_dot_B1, Tba[1] - aA0_dot_B1, A1_dot_B0,
1487 aA0_dot_B0 - Tba[0], -tfab.translation()[1]))
1490 inVoronoi(a[1], b[0], A0_dot_B0, tfab.translation()[0] - a[0],
1491 A1_dot_B0, tfab.translation()[1], Tba[0] - aA0_dot_B0)))
1493 segCoords(t, u, a[1], b[0], A1_dot_B0, tfab.translation()[1], Tba[0] - aA0_dot_B0);
1495 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * u - a[0];
1496 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * u - t;
1497 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * u;
1511 if((LA1_uy > b[1]) && (UB0_lx < 0))
1513 if(((LA1_ly > b[1]) ||
1514 inVoronoi(b[0], a[1], A1_dot_B1, -Tba[1] - b[1],
1515 A1_dot_B0, -Tba[0], -tfab.translation()[1] - bA1_dot_B1))
1519 inVoronoi(a[1], b[0], -A0_dot_B0, -tfab.translation()[0] - bA0_dot_B1, A1_dot_B0,
1520 tfab.translation()[1] + bA1_dot_B1, Tba[0])))
1522 segCoords(t, u, a[1], b[0], A1_dot_B0, tfab.translation()[1] + bA1_dot_B1, Tba[0]);
1524 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * b[1] + tfab.linear()(0, 0) * u;
1525 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * b[1] + tfab.linear()(1, 0) * u - t;
1526 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * b[1] + tfab.linear()(2, 0) * u;
1541 if((LA1_ly < 0) && (LB0_lx < 0))
1544 inVoronoi(b[0], a[1], -A1_dot_B1, Tba[1], A1_dot_B0,
1545 -Tba[0], -tfab.translation()[1]))
1548 inVoronoi(a[1], b[0], -A0_dot_B0, -tfab.translation()[0], A1_dot_B0,
1549 tfab.translation()[1], Tba[0])))
1551 segCoords(t, u, a[1], b[0], A1_dot_B0, tfab.translation()[1], Tba[0]);
1553 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * u;
1554 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * u - t;
1555 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * u;
1567 S BLL_y, BLU_y, BUL_y, BUU_y;
1569 BLL_y = tfab.translation()[1];
1570 BLU_y = BLL_y + bA1_dot_B1;
1571 BUL_y = BLL_y + bA1_dot_B0;
1572 BUU_y = BLU_y + bA1_dot_B0;
1574 S LA0_lx, LA0_ux, UA0_lx, UA0_ux, LB1_ly, LB1_uy, UB1_ly, UB1_uy;
1608 if((UA0_ux > b[0]) && (UB1_uy > a[1]))
1610 if(((UA0_lx > b[0]) ||
1611 inVoronoi(b[1], a[0], A0_dot_B0, aA1_dot_B0 - Tba[0] - b[0],
1612 A0_dot_B1, aA1_dot_B1 - Tba[1], -tfab.translation()[0] - bA0_dot_B0))
1615 inVoronoi(a[0], b[1], A1_dot_B1, tfab.translation()[1] - a[1] + bA1_dot_B0,
1616 A0_dot_B1, tfab.translation()[0] + bA0_dot_B0, Tba[1] - aA1_dot_B1)))
1618 segCoords(t, u, a[0], b[1], A0_dot_B1, tfab.translation()[0] + bA0_dot_B0,
1619 Tba[1] - aA1_dot_B1);
1621 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * b[0] + tfab.linear()(0, 1) * u - t;
1622 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * b[0] + tfab.linear()(1, 1) * u - a[1];
1623 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * b[0] + tfab.linear()(2, 1) * u;
1637 if((UA0_lx < 0) && (LB1_uy > a[1]))
1640 inVoronoi(b[1], a[0], -A0_dot_B0, Tba[0] - aA1_dot_B0, A0_dot_B1,
1641 aA1_dot_B1 - Tba[1], -tfab.translation()[0]))
1644 inVoronoi(a[0], b[1], A1_dot_B1, tfab.translation()[1] - a[1], A0_dot_B1, tfab.translation()[0],
1645 Tba[1] - aA1_dot_B1)))
1647 segCoords(t, u, a[0], b[1], A0_dot_B1, tfab.translation()[0], Tba[1] - aA1_dot_B1);
1649 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * u - t;
1650 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * u - a[1];
1651 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * u;
1665 if((LA0_ux > b[0]) && (UB1_ly < 0))
1667 if(((LA0_lx > b[0]) ||
1668 inVoronoi(b[1], a[0], A0_dot_B0, -b[0] - Tba[0], A0_dot_B1, -Tba[1],
1669 -bA0_dot_B0 - tfab.translation()[0]))
1672 inVoronoi(a[0], b[1], -A1_dot_B1, -tfab.translation()[1] - bA1_dot_B0, A0_dot_B1,
1673 tfab.translation()[0] + bA0_dot_B0, Tba[1])))
1675 segCoords(t, u, a[0], b[1], A0_dot_B1, tfab.translation()[0] + bA0_dot_B0, Tba[1]);
1677 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * b[0] + tfab.linear()(0, 1) * u - t;
1678 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * b[0] + tfab.linear()(1, 1) * u;
1679 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * b[0] + tfab.linear()(2, 1) * u;
1693 if((LA0_lx < 0) && (LB1_ly < 0))
1696 inVoronoi(b[1], a[0], -A0_dot_B0, Tba[0], A0_dot_B1, -Tba[1],
1697 -tfab.translation()[0]))
1700 inVoronoi(a[0], b[1], -A1_dot_B1, -tfab.translation()[1], A0_dot_B1,
1701 tfab.translation()[0], Tba[1])))
1703 segCoords(t, u, a[0], b[1], A0_dot_B1, tfab.translation()[0], Tba[1]);
1705 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * u - t;
1706 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * u;
1707 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * u;
1719 S LA0_ly, LA0_uy, UA0_ly, UA0_uy, LB0_ly, LB0_uy, UB0_ly, UB0_uy;
1753 if((UA0_uy > b[1]) && (UB0_uy > a[1]))
1755 if(((UA0_ly > b[1]) ||
1756 inVoronoi(b[0], a[0], A0_dot_B1, aA1_dot_B1 - Tba[1] - b[1],
1757 A0_dot_B0, aA1_dot_B0 - Tba[0], -tfab.translation()[0] - bA0_dot_B1))
1760 inVoronoi(a[0], b[0], A1_dot_B0, tfab.translation()[1] - a[1] + bA1_dot_B1, A0_dot_B0,
1761 tfab.translation()[0] + bA0_dot_B1, Tba[0] - aA1_dot_B0)))
1763 segCoords(t, u, a[0], b[0], A0_dot_B0, tfab.translation()[0] + bA0_dot_B1,
1764 Tba[0] - aA1_dot_B0);
1766 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * b[1] + tfab.linear()(0, 0) * u - t;
1767 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * b[1] + tfab.linear()(1, 0) * u - a[1];
1768 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * b[1] + tfab.linear()(2, 0) * u;
1782 if((UA0_ly < 0) && (LB0_uy > a[1]))
1785 inVoronoi(b[0], a[0], -A0_dot_B1, Tba[1] - aA1_dot_B1, A0_dot_B0,
1786 aA1_dot_B0 - Tba[0], -tfab.translation()[0]))
1789 inVoronoi(a[0], b[0], A1_dot_B0, tfab.translation()[1] - a[1],
1790 A0_dot_B0, tfab.translation()[0], Tba[0] - aA1_dot_B0)))
1792 segCoords(t, u, a[0], b[0], A0_dot_B0, tfab.translation()[0], Tba[0] - aA1_dot_B0);
1794 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * u - t;
1795 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * u - a[1];
1796 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * u;
1810 if((LA0_uy > b[1]) && (UB0_ly < 0))
1812 if(((LA0_ly > b[1]) ||
1813 inVoronoi(b[0], a[0], A0_dot_B1, -Tba[1] - b[1], A0_dot_B0, -Tba[0],
1814 -tfab.translation()[0] - bA0_dot_B1))
1818 inVoronoi(a[0], b[0], -A1_dot_B0, -tfab.translation()[1] - bA1_dot_B1, A0_dot_B0,
1819 tfab.translation()[0] + bA0_dot_B1, Tba[0])))
1821 segCoords(t, u, a[0], b[0], A0_dot_B0, tfab.translation()[0] + bA0_dot_B1, Tba[0]);
1823 D[0] = tfab.translation()[0] + tfab.linear()(0, 1) * b[1] + tfab.linear()(0, 0) * u - t;
1824 D[1] = tfab.translation()[1] + tfab.linear()(1, 1) * b[1] + tfab.linear()(1, 0) * u;
1825 D[2] = tfab.translation()[2] + tfab.linear()(2, 1) * b[1] + tfab.linear()(2, 0) * u;
1839 if((LA0_ly < 0) && (LB0_ly < 0))
1842 inVoronoi(b[0], a[0], -A0_dot_B1, Tba[1], A0_dot_B0,
1843 -Tba[0], -tfab.translation()[0]))
1846 inVoronoi(a[0], b[0], -A1_dot_B0, -tfab.translation()[1], A0_dot_B0,
1847 tfab.translation()[0], Tba[0])))
1849 segCoords(t, u, a[0], b[0], A0_dot_B0, tfab.translation()[0], Tba[0]);
1851 D[0] = tfab.translation()[0] + tfab.linear()(0, 0) * u - t;
1852 D[1] = tfab.translation()[1] + tfab.linear()(1, 0) * u;
1853 D[2] = tfab.translation()[2] + tfab.linear()(2, 0) * u;
1869 if(tfab.translation()[2] > 0.0)
1871 sep1 = tfab.translation()[2];
1872 if (tfab.linear()(2, 0) < 0.0) sep1 += b[0] * tfab.linear()(2, 0);
1873 if (tfab.linear()(2, 1) < 0.0) sep1 += b[1] * tfab.linear()(2, 1);
1877 sep1 = -tfab.translation()[2];
1878 if (tfab.linear()(2, 0) > 0.0) sep1 -= b[0] * tfab.linear()(2, 0);
1879 if (tfab.linear()(2, 1) > 0.0) sep1 -= b[1] * tfab.linear()(2, 1);
1885 if (tfab.linear()(0, 2) < 0.0) sep2 += a[0] * tfab.linear()(0, 2);
1886 if (tfab.linear()(1, 2) < 0.0) sep2 += a[1] * tfab.linear()(1, 2);
1891 if (tfab.linear()(0, 2) > 0.0) sep2 -= a[0] * tfab.linear()(0, 2);
1892 if (tfab.linear()(1, 2) > 0.0) sep2 -= a[1] * tfab.linear()(1, 2);
1895 if(sep1 >= sep2 && sep1 >= 0)
1897 if(tfab.translation()[2] > 0)
1909 if(sep2 >= sep1 && sep2 >= 0)
1915 P_.noalias() = tfab.linear().col(2) * sep2;
1916 P_.noalias() += tfab.translation();
1920 P_.noalias() = tfab.linear().col(2) * -sep2;
1921 P_.noalias() += tfab.translation();
1933 S sep = (sep1 > sep2 ? sep1 : sep2);
1934 return (sep > 0 ? sep : 0);
1938 template <
typename S,
typename DerivedA,
typename DerivedB>
1940 const Eigen::MatrixBase<DerivedA>& R0,
1941 const Eigen::MatrixBase<DerivedB>& T0,
1952 return (dist <= (b1.
r + b2.
r));
1956 template <
typename S,
typename DerivedA,
typename DerivedB>
1958 const Eigen::MatrixBase<DerivedA>& R0,
1959 const Eigen::MatrixBase<DerivedB>& T0,
1972 dist -= (b1.
r + b2.
r);
1973 return (dist < (S)0.0) ? (S)0.0 : dist;
1977 template <
typename S>