You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
997 B
38 lines
997 B
14 years ago
|
|
||
|
#ifndef UNRAVELHEART3D_HPP
|
||
|
#define UNRAVELHEART3D_HPP
|
||
|
|
||
|
#include "../AttractorKernel.hpp"
|
||
|
|
||
|
#include <cmath>
|
||
|
|
||
|
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 dist = vectorNew[0]*vectorNew[0] + vectorNew[1]*vectorNew[1] + 2.0*vectorNew[2]*vectorNew[2];
|
||
|
|
||
|
if(parameters[7] * dist - parameters[7] > vectorNew[0]*vectorNew[0]*vectorNew[1]*vectorNew[1]*vectorNew[1]) {
|
||
|
const double sqrtDist = std::sqrt(dist);
|
||
|
const double p = 1.0 - parameters[6] * (static_cast<int>(sqrtDist / parameters[6]) + 1.0) / sqrtDist;
|
||
|
vectorNew[0] *= p;
|
||
|
vectorNew[1] *= p;
|
||
|
vectorNew[2] *= p;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif // UNRAVEL_HPP
|
||
|
|