#pragma once #include "../std/vector.hpp" #include "../std/shared_ptr.hpp" #include "point2d.hpp" namespace m2 { class Spline { public: class iterator { public: PointF m_pos; PointF m_dir; PointF m_avrDir; iterator(); void Attach(Spline const & spl); void Step(float speed); bool BeginAgain() const; private: friend class Spline; float GetDistance() const; int GetIndex() const; private: bool m_checker; Spline const * m_spl; int m_index; float m_dist; }; public: Spline() {} Spline(vector const & path); Spline const & operator = (Spline const & spl); void AddPoint(PointF const & pt); vector const & GetPath() const { return m_position; } template void ForEachNode(iterator const & begin, iterator const & end, TFunctor & f) const { ASSERT(begin.BeginAgain() == false, ()); ASSERT(end.BeginAgain() == false, ()); if (!my::AlmostEqual(begin.GetDistance(), 0.0f)) f(begin.m_pos); for (int i = begin.GetIndex() + 1; i <= end.GetIndex(); ++i) f(m_position[i]); if (!my::AlmostEqual(end.GetDistance(), 0.0f)) f(end.m_pos); } bool IsEmpty() const; bool IsValid() const; float GetLength() const; private: vector m_position; vector m_direction; vector m_length; }; class SharedSpline { public: SharedSpline() {} SharedSpline(vector const & path); SharedSpline(SharedSpline const & other); SharedSpline const & operator= (SharedSpline const & spl); bool IsNull() const; void Reset(Spline * spline); void Reset(vector const & path); Spline::iterator CreateIterator() const; Spline * operator->(); Spline const * operator->() const; private: shared_ptr m_spline; }; }