#ifndef WALKMODULEHEADING_H #define WALKMODULEHEADING_H #include "WalkModule.h" #include "WalkStateHeading.h" #include "../../../../geo/Heading.h" #include "../../../../math/Distributions.h" /** keep the state's heading */ template class WalkModuleHeading : public WalkModule { private: /** van-Mises distribution */ Distribution::LUT dist; /** van-Mises draw list */ DrawList draw; public: /** ctor */ WalkModuleHeading() : dist(Distribution::VonMises(0.0f, 1.0f).getLUT()), draw(dist.getDrawList()) { ; } virtual void updateBefore(WalkState& state) override { (void) state; state.startHeading += draw.get(); } virtual void updateAfter(WalkState& state, const Node& startNode, const Node& endNode) override { // if (startNode.x_cm != endNode.x_cm || startNode.y_cm != endNode.y_cm) { // Heading head(startNode.x_cm, startNode.y_cm, endNode.x_cm, endNode.y_cm); // state.startHeading = head; // } } /** one step (edge) is taken */ virtual void step(WalkState& state, const Node& curNode, const Node& nextNode) override { // TODO (void) state; (void) curNode; (void) nextNode; } double getProbability(const WalkState& state, const Node& startNode, const Node& curNode, const Node& potentialNode) const override { (void) startNode; // get the heading between curNode and potentialNode const Heading head(curNode.x_cm, curNode.y_cm, potentialNode.x_cm, potentialNode.y_cm); // compare the heading against the state's heading const Heading stateHead = state.startHeading; // get the difference const float angularDiff = head.getDiffHalfRAD(stateHead);//head.getRAD() - stateHead.getRAD(); // determine probability return dist.getProbability(angularDiff); } }; #endif // WALKMODULEHEADING_H