#ifndef UNRAVEL_HPP #define UNRAVEL_HPP #include "../AttractorKernel.hpp" #include class Unravel3D : public AttractorKernel { public: Unravel3D(): AttractorKernel(3, 7) {} virtual std::string type() { return "unravel"; }; virtual void operator()() { std::swap(vectorNew, vectorOld); vectorNew[0] = parameters[0]*(vectorOld[2] + parameters[1]); vectorNew[1] = parameters[2]*(vectorOld[0] + parameters[3]); vectorNew[2] = parameters[4]*(vectorOld[1] + parameters[5]); const double dist = vectorNew[0]*vectorNew[0] + vectorNew[1]*vectorNew[1] + vectorNew[2]*vectorNew[2]; if(dist > parameters[6]*parameters[6]) { const double sqrtDist = std::sqrt(dist); const double p = 1.0 - parameters[6] * (static_cast(sqrtDist / parameters[6]) + 1.0) / sqrtDist; vectorNew[0] *= p; vectorNew[1] *= p; vectorNew[2] *= p; } } }; #endif // UNRAVEL_HPP