#ifndef PSP_H
#define PSP_H
+#include <tuple>
+#include <vector>
+
#include "bcar.h"
#include "pslot.h"
*/
class PSPlanner {
private:
- BicycleCar *cc_ = nullptr;
- BicycleCar *gc_ = new BicycleCar();
- ParkingSlot *ps_ = new ParkingSlot();
+ BicycleCar cc_;
+ BicycleCar gc_;
+ ParkingSlot ps_;
+
+ // find entry to slot
+ void fe_parallel();
+ void fe_perpendicular();
+ // find entry to slot by reverse approach
+ void fer_parallel();
+ void fer_perpendicular();
+ // set goal car
+ void gc_to_4();
public:
+ /*! \brief Return `true` if there is collision.
+
+ If the parking slot `ps` collide with current car `cc`,
+ return `true`.
+
+ This method depends on `intersection` function that
+ returns `true` or `false` if two line segments collide.
+ Each line segment of current car `cc` (borders) is
+ checked to each line segment of parking slot `ps`
+ (parking slot lines).
+ */
+ bool collide();
+ /*! \brief Return parking direction
+
+ Return `true` if the direction of the parking in the
+ slot is forward.
+ */
+ bool forward();
+ /*! \brief Guess goal car
+
+ Set the goal car guessed from the parking slot.
+ */
+ void guess_gc();
+ /*! \brief Has current car `cc` left?
+
+ Return `true` if the current car `cc` left the parking
+ slot `ps`;
+ */
+ bool left();
+ /*! \brief Is the goal car `gc` parked?
+
+ Return `true` if the goal car `gc` is inside the
+ parking slot `ps`.
+ */
+ bool parked();
+ /*! \brief Return possible starts of parking maneuver
+
+ When any `BicycleCar` of possible inits is reached, then
+ parking maneuver is a peace of cake.
+
+ \param cnt Number of inits.
+ \param dist Distance between inits.
+ */
+ std::vector<BicycleCar> possible_goals(
+ unsigned int cnt,
+ double dist
+ );
+ std::vector<BicycleCar> possible_goals()
+ {
+ return this->possible_goals(10, 1);
+ }
+
// find entry
/*! \brief Find entry to the parking slot.
*/
void fer();
// getters, setters
- BicycleCar *cc() { return this->cc_; }
- BicycleCar *gc() { return this->gc_; }
- ParkingSlot *ps() { return this->ps_; }
+ BicycleCar &cc() { return this->cc_; }
+ BicycleCar &gc() { return this->gc_; }
+ ParkingSlot &ps() { return this->ps_; }
PSPlanner();
};