33 #define CC_REGULAR false
70 double x = (c1.
xc + c2.
xc) / 2;
71 double y = (c1.
yc + c2.
yc) / 2;
101 TT_tangent_circles(c1, c2, q);
123 double delta_y = sqrt(pow(c1.
radius, 2) - pow(delta_x, 2));
157 TcT_tangent_circles(c1, c2, q);
180 double theta =
angle;
183 double delta_y = sqrt(pow(r, 2) - pow(delta_x, 2));
191 TcT_tangent_circles(c1, tgt1, q1);
192 TcT_tangent_circles(tgt1, c2, q2);
193 TcT_tangent_circles(c1, tgt2, q3);
194 TcT_tangent_circles(tgt2, c2, q4);
201 TcTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
209 if (length1 < length2)
229 return numeric_limits<double>::max();
249 double theta =
angle;
251 double r2 = 2 * c1.
radius;
252 double delta_x = (pow(r1, 2) + pow(
distance, 2) - pow(r2, 2)) / (2 *
distance);
253 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
261 TcT_tangent_circles(c1, tgt1, q1);
262 TT_tangent_circles(tgt1, c2, q2);
263 TcT_tangent_circles(c1, tgt2, q3);
264 TT_tangent_circles(tgt2, c2, q4);
271 TcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
279 if (length1 < length2)
299 return numeric_limits<double>::max();
319 double theta =
angle;
320 double r1 = 2 * c1.
radius;
322 double delta_x = (pow(r1, 2) + pow(
distance, 2) - pow(r2, 2)) / (2 *
distance);
323 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
331 TT_tangent_circles(c1, tgt1, q1);
332 TcT_tangent_circles(tgt1, c2, q2);
333 TT_tangent_circles(c1, tgt2, q3);
334 TcT_tangent_circles(tgt2, c2, q4);
341 TTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
349 if (length1 < length2)
369 return numeric_limits<double>::max();
402 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
453 double theta = atan2(c2.
yc - c1.
yc, c2.
xc - c1.
xc);
487 TiST_tangent_circles(c1, c2, q1, q2);
493 TeST_tangent_circles(c1, c2, q1, q2);
499 if (TiST_exists(c1, c2))
501 return TiST_path(c1, c2, q1, q2);
503 if (TeST_exists(c1, c2))
505 return TeST_path(c1, c2, q1, q2);
507 return numeric_limits<double>::max();
539 return TiSTcT_exists(c1, c2) || TeSTcT_exists(c1, c2);
545 double theta =
angle;
547 double delta_y = pow(2 * r, 2) /
distance;
548 double delta_x = 2 * r * sqrt(1 - delta_y /
distance);
554 TiST_tangent_circles(c1, tgt1, q1, q2);
555 TcT_tangent_circles(tgt1, c2, q3);
566 double theta =
angle;
574 TeST_tangent_circles(c1, tgt1, q1, q2);
575 TcT_tangent_circles(tgt1, c2, q3);
586 if (TiSTcT_exists(c1, c2))
588 return TiSTcT_path(c1, c2, q1, q2, q3, ci);
590 if (TeSTcT_exists(c1, c2))
592 return TeSTcT_path(c1, c2, q1, q2, q3, ci);
594 return numeric_limits<double>::max();
626 return TcTiST_exists(c1, c2) || TcTeST_exists(c1, c2);
632 double theta =
angle;
634 double delta_y = pow(2 * r, 2) /
distance;
635 double delta_x = 2 * r * sqrt(1 - delta_y /
distance);
641 TcT_tangent_circles(c1, tgt1, q1);
642 TiST_tangent_circles(tgt1, c2, q2, q3);
653 double theta =
angle;
661 TcT_tangent_circles(c1, tgt1, q1);
662 TeST_tangent_circles(tgt1, c2, q2, q3);
673 if (TcTiST_exists(c1, c2))
675 return TcTiST_path(c1, c2, q1, q2, q3, ci);
677 if (TcTeST_exists(c1, c2))
679 return TcTeST_path(c1, c2, q1, q2, q3, ci);
681 return numeric_limits<double>::max();
713 return TcTiSTcT_exists(c1, c2) || TcTeSTcT_exists(c1, c2);
719 double theta =
angle;
721 double delta_y = pow(2 * r, 2) /
distance;
722 double delta_x = 2 * r * sqrt(1 - delta_y /
distance);
730 TcT_tangent_circles(c1, tgt1, q1);
731 TiST_tangent_circles(tgt1, tgt2, q2, q3);
732 TcT_tangent_circles(tgt2, c2, q4);
744 double theta =
angle;
754 TcT_tangent_circles(c1, tgt1, q1);
755 TeST_tangent_circles(tgt1, tgt2, q2, q3);
756 TcT_tangent_circles(tgt2, c2, q4);
768 if (TcTiSTcT_exists(c1, c2))
770 return TcTiSTcT_path(c1, c2, q1, q2, q3, q4, ci1, ci2);
772 if (TcTeSTcT_exists(c1, c2))
774 return TcTeSTcT_path(c1, c2, q1, q2, q3, q4, ci1, ci2);
776 return numeric_limits<double>::max();
796 double theta =
angle;
797 double r1, r2, delta_x, delta_y, x, y;
803 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 2));
808 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 2));
821 TT_tangent_circles(c1, tgt1, q1);
822 TcT_tangent_circles(tgt1, tgt2, q2);
823 TT_tangent_circles(tgt2, c2, q3);
825 TT_tangent_circles(c1, tgt3, q4);
826 TcT_tangent_circles(tgt3, tgt4, q5);
827 TT_tangent_circles(tgt4, c2, q6);
834 TTcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
846 if (length1 < length2)
874 return numeric_limits<double>::max();
894 double theta =
angle;
897 double delta_x = (pow(r1, 2) + pow(
distance / 2, 2) - pow(r2, 2)) /
distance;
898 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
911 TcT_tangent_circles(c1, tgt1, q1);
912 TT_tangent_circles(tgt1, tgt2, q2);
913 TcT_tangent_circles(tgt2, c2, q3);
915 TcT_tangent_circles(c1, tgt3, q4);
916 TT_tangent_circles(tgt3, tgt4, q5);
917 TcT_tangent_circles(tgt4, c2, q6);
924 TcTTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
936 if (length1 < length2)
964 return numeric_limits<double>::max();
986 double theta =
angle;
989 double delta_y = sqrt(pow(r, 2) - pow(delta_x, 2));
997 TT_tangent_circles(c1, tgt1, q1);
998 TT_tangent_circles(tgt1, c2, q2);
999 TT_tangent_circles(c1, tgt2, q3);
1000 TT_tangent_circles(tgt2, c2, q4);
1007 TTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
1015 if (length1 < length2)
1035 return numeric_limits<double>::max();
1067 return TciST_exists(c1, c2) || TceST_exists(c1, c2);
1113 double theta =
angle;
1150 if (TciST_exists(c1, c2))
1152 return TciST_path(c1, c2, q1, q2);
1154 if (TceST_exists(c1, c2))
1156 return TceST_path(c1, c2, q1, q2);
1158 return numeric_limits<double>::max();
1190 return TiScT_exists(c1, c2) || TeScT_exists(c1, c2);
1236 double theta =
angle;
1273 if (TiScT_exists(c1, c2))
1275 return TiScT_path(c1, c2, q1, q2);
1277 if (TeScT_exists(c1, c2))
1279 return TeScT_path(c1, c2, q1, q2);
1281 return numeric_limits<double>::max();
1313 return TciScT_exists(c1, c2) || TceScT_exists(c1, c2);
1359 double theta =
angle;
1396 if (TciScT_exists(c1, c2))
1398 return TciScT_path(c1, c2, q1, q2);
1400 if (TceScT_exists(c1, c2))
1402 return TceScT_path(c1, c2, q1, q2);
1404 return numeric_limits<double>::max();
1410 CC00_Reeds_Shepp_State_Space::CC00_Reeds_Shepp_State_Space(
double kappa,
double sigma,
double discretization)
1412 , cc00_reeds_shepp_{ unique_ptr<CC00_Reeds_Shepp>(
new CC00_Reeds_Shepp(
this)) }
1603 qi3[best_path], qi4[best_path], cstart[best_path], cend[best_path], ci1[best_path],
1604 ci2[best_path],
length[best_path]);
1642 HC_CC_RS_Path *
path[] = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1643 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr };
1645 double lg[] = { numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1646 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1647 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1648 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1649 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1650 numeric_limits<double>::max() };
1652 for (
int i = 0; i < 4; i++)
1654 for (
int j = 0; j < 4; j++)
1657 if (
path[4 * i + j])
1659 lg[4 * i + j] =
path[4 * i + j]->length;
1682 for (
int i = 0; i < 4; i++)
1684 delete start_circle[i];
1685 delete end_circle[i];
1687 for (
int i = 0; i < 16; i++)
1694 return path[best_path];
1707 vector<Control> cc_rs_controls;
1708 cc_rs_controls.reserve(13);
1782 return cc_rs_controls;