friend std::ostream& operator<<(std::ostream& out, Pose const& p);
};
+class PoseRange : public Pose {
+private:
+ double e_ = 0.0;
+ using Pose::h;
+public:
+ /*! Get heading's begin in the interval [-pi, +pi] radians. */
+ double b() const;
+
+ /*! Set heading's begin in radians. It's recomputed to [-pi, +pi]. */
+ void b(double b);
+
+ /*! Get heading's end in the interval [-pi, +pi] radians. */
+ double e() const;
+
+ /*! Set heading's end in radians. It's recomputed to [-pi, +pi]. */
+ void e(double e);
+
+ void rotate(Point const& c, double const angl);
+
+ friend std::ostream& operator<<(std::ostream& out, PoseRange const& p);
+};
+
/*! \brief Store car size.
*
* - Default is https://en.wikipedia.org/wiki/Fiat_Punto
return out;
}
+double
+PoseRange::b() const
+{
+ return this->h();
+}
+
+void
+PoseRange::b(double b)
+{
+ this->h(b);
+}
+
+double
+PoseRange::e() const
+{
+ return this->e_;
+}
+
+void
+PoseRange::e(double e)
+{
+ while (e < -M_PI) {
+ e += 2 * M_PI;
+ }
+ while (e > +M_PI) {
+ e -= 2 * M_PI;
+ }
+ this->e_ = e;
+}
+
+void
+PoseRange::rotate(Point const& c, double const angl)
+{
+ Pose::rotate(c, angl);
+ this->e(this->e() + angl);
+}
+
+std::ostream&
+operator<<(std::ostream& out, PoseRange const& p)
+{
+ out << "[" << p.x() << "," << p.y() << "," << p.b() << "," << p.e();
+ out << "]";
+ return out;
+}
+
double
CarSize::ctc() const
{