#ifndef UNRAVELHEART3D_HPP #define UNRAVELHEART3D_HPP #include "../AttractorKernel.hpp" #include class UnravelHeart3D : public AttractorKernel { public: UnravelHeart3D(): AttractorKernel(3, 8) {} virtual std::string type() { return "unravel heart"; }; 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 x = vectorNew[0] / parameters[6]; const double y = vectorNew[1] / parameters[6]; const double z = vectorNew[2] / parameters[6]; const double dist = x*x + y*y + 2.0*z*z; if(parameters[7] * dist - parameters[7] > x*x*y*y*y) { 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