BicycleCar *ParallelSlot::getISPP(BicycleCar *B)
{
+ // rigt side (for right parking slot)
float x = this->slot().bnodes().back()->x();
float y = this->slot().bnodes().back()->y();
- float y0;
- if (this->slotSide() == LEFT) // TODO only for backward parking now
- y0 = B->ccl()->y();
- else
- y0 = B->ccr()->y();
+ float x1;
+ float y1;
+ if (this->slotSide() == LEFT) {
+ x1 = B->ccl()->x();
+ y1 = B->ccl()->y();
+ } else {
+ x1 = B->ccr()->x();
+ y1 = B->ccr()->y();
+ }
float IR = BCAR_IN_RADI;
float a = 1;
- float b = -2 * x;
- float c = pow(x, 2) + pow(y - y0, 2) - pow(IR, 2);
+ float b = (x1 - x) * 2 * cos(B->h()) + (y1 - y) * 2 * sin(B->h());
+ float c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
float D = pow(b, 2) - 4 * a * c;
- float x0;
- if (this->slotSide() == LEFT)
- x0 = -b - sqrt(D);
- else
- x0 = -b + sqrt(D);
- x0 /= 2 * a;
- return new BicycleCar(x0, B->y(), B->h());
+ float delta;
+ delta = -b - sqrt(D);
+ delta /= 2 * a;
+ float delta_1 = delta;
+ // left front (for right parking slot)
+ x = this->slot().bnodes().front()->x();
+ y = this->slot().bnodes().front()->y();
+ IR = BCAR_OUT_RADI;
+ a = 1;
+ b = (x1 - x) * 2 * cos(B->h()) + (y1 - y) * 2 * sin(B->h());
+ c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
+ D = pow(b, 2) - 4 * a * c;
+ //delta = -b + sqrt(D);
+ //delta /= 2 * a;
+ float delta_2 = delta;
+ delta = -b - sqrt(D);
+ delta /= 2 * a;
+ float delta_3 = delta;
+ delta = std::max(delta_1, std::max(delta_2, delta_3));
+ return new BicycleCar(
+ B->x() + delta * cos(B->h()),
+ B->y() + delta * sin(B->h()),
+ B->h()
+ );
}
BicycleCar *ParallelSlot::getFPf()