#ifndef IKEDA3D_HPP
#define IKEDA3D_HPP

#include "../AttractorKernel.hpp"

#include <algorithm>


class Ikeda3D : public AttractorKernel {
private:
	void init() {
		// setting some starting values
		std::fill_n(vectorOld, dimension, 0.5);
		std::fill_n(vectorNew, dimension, 0.5);
	}

public:
	Ikeda3D():
		AttractorKernel(3, 4) {
		init();
	}

	virtual std::string type() { return "ikeda"; };

	virtual void generate_random_parameters() {
		parameters[0] = rand() / double(RAND_MAX) *2.0 - 0.5;
		parameters[1] = rand() / double(RAND_MAX) *2.0 - 0.5;	// wikipedia: u
		parameters[2] = rand() / double(RAND_MAX) *2.0 - 0.5;
		parameters[3] = rand() / double(RAND_MAX) *20.0;
		init();
	}

	virtual void operator()() {
		std::swap(vectorNew, vectorOld);

		vectorOld[2] = parameters[2] - parameters[3]/(1 + vectorOld[0]*vectorOld[0] + vectorOld[1]*vectorNew[1]);

		vectorNew[0] = parameters[0] + parameters[1] * (vectorOld[0]*cos(vectorOld[2]) - vectorOld[1]*sin(vectorOld[2]));
		vectorNew[1] = parameters[1] * (vectorOld[0]*sin(vectorOld[2]) + vectorOld[1]*cos(vectorOld[2]));
	}
};

#endif // IKEDA3D_HPP