ccrx, ccry,
this->cc().rfx(), this->cc().rfy()
);
- // TODO check if I can park
+ {
+ auto clif = ::intersect(
+ ccrx, ccry, ccr_lf,
+ this->ps().x1(), this->ps().y1(),
+ this->ps().x4(), this->ps().y4()
+ );
+ double af = std::abs(
+ this->ps().heading()
+ - this->cc().h()
+ );
+ double xf = this->ps().x4();
+ double yf = this->ps().y4();
+ if (std::get<0>(clif)) {
+ xf = std::get<1>(clif);
+ yf = std::get<2>(clif);
+ if (
+ edist(
+ this->ps().x4(),
+ this->ps().y4(),
+ std::get<3>(clif),
+ std::get<4>(clif)
+ ) < edist(
+ this->ps().x4(),
+ this->ps().y4(),
+ xf, yf
+ )
+ ) {
+ xf = std::get<3>(clif);
+ yf = std::get<4>(clif);
+ }
+ af = ::angle_between_three_points(
+ this->cc().lfx(),
+ this->cc().lfy(),
+ ccrx, ccry,
+ xf, yf
+ );
+ }
+ auto tmp_cc = BicycleCar(this->cc());
+ this->cc().rotate(ccrx, ccry, -af);
+ if (
+ !this->collide()
+ && (
+ edist(
+ this->ps().x1(),
+ this->ps().y1(),
+ xf, yf
+ ) < edist(
+ this->ps().x1(),
+ this->ps().y1(),
+ this->ps().x4(),
+ this->ps().y4()
+ )
+ || !std::get<0>(clif)
+ )
+ ) {
+ this->cc().sp(this->cc().sp() * -1);
+ this->gc() = BicycleCar(this->cc());
+ goto successfinish;
+ } else {
+ this->cc() = BicycleCar(tmp_cc);
+ }
+ }
// TODO (ccr, rf) x (p3, p4)
// TODO (ccr, rf) x (p2, p3)
// TODO (ccr, lf) x (p3, p4)