Line _front;
public:
std::vector<std::vector<BicycleCar>> _ispaths;
+ std::vector<BicycleCar> _entries;
/*! \brief Set parking slot.
\param p Point with `x`, `y` coordinates of entry side's corner.
*/
PoseRange fe(BicycleCar c);
+ /*! \brief Compute entries from `this->_ispaths`.
+ *
+ * The problem with in-slot paths is that car can't leave the parking
+ * slot with full rate to the right (for right sided parking slot.)
+ *
+ * The idea is to move the first cars of in-slot paths (the one that is
+ * computed as entry to the parking slot) with the full rate to the left
+ * until they can leave the parking slot with full rate to the right.
+ *
+ * The computed cars are stored in `this->_entries`.
+ */
+ void compute_entries();
+
/*! \brief Recompute zero slot's `PoseRange` entry for `this`.
*
* The _zero slot_ is the `ParkingSlot(Point(0.0, 0.0), 0.0, W, L);`.
return p;
}
+void
+ParkingSlot::compute_entries()
+{
+ assert(this->_ispaths.size() > 0);
+ assert(this->right());
+ this->_entries.clear();
+ for (auto p: this->_ispaths) {
+ this->_entries.push_back(p.front());
+ }
+ for (auto& e: this->_entries) {
+ e.sp(e.sp() * -1.0);
+ while (!this->lf().inside_of(e.ccr(), e.iradi())) {
+ e.next();
+ }
+ }
+}
+
PoseRange
ParkingSlot::recompute_entry(PoseRange p)
{
WVPASS(!ps.parallel());
WVPASSEQ_DOUBLE(ps.h(), -M_PI / 4.0, 0.00001);
}
+
+WVTEST_MAIN("entries")
+{
+ ParkingSlot s(Point(0, 0), 0, 2.5, 6);
+ s.fe(BicycleCar());
+ s.compute_entries();
+ WVPASS(s._entries.size() > 0);
+ for (auto& e: s._entries) {
+ WVPASS(s.lf().inside_of(e.ccr(), e.iradi()));
+ }
+}