#ifndef K_MATH_DISTRIBUTION_VONMISES_H #define K_MATH_DISTRIBUTION_VONMISES_H #include #include #include "../Math.h" #include "Bessel.h" #include "LUT.h" namespace Distribution { /** von-mises distribution */ template class VonMises { private: /** center of the distribution */ const T mu; /** like 1.0/variance of the distribution */ const T kappa; /** pre-calcuated look-up-table */ std::vector lut; /** helper for modified bessel I_0(kappa) */ Bessel bessel; public: /** ctor */ VonMises(const T mu, const T kappa) : mu(mu), kappa(kappa) { } LUT getLUT() const { return LUT(*this, -M_PI, +M_PI, 10000); } /** get probability for the given value */ T getProbability(const T _val) const { const T val = Math::clamp((T)-M_PI, (T)+M_PI, _val); return std::exp(kappa * std::cos(val - mu)) / (2 * M_PI * bessel.getModified(0, kappa)); } }; } #endif // K_MATH_DISTRIBUTION_VONMISES_H