Drawing Ikeda Function

I want to reproduce the Ikeda chaos map example on Wikipedia but I dont manage to have the same result, complexity. I have only one attractor, the center… any advice ?

size(500, 700); 
background(250);
int margin = 20;

int iterations = 4500;
float tn;
float u = 0.918;
float[] xn = new float[iterations];
float[] yn = new float[iterations];
xn[0] = random(1, 20)*100;
yn[0] =random(1, 20)*100; 

translate(width/2, height/2);
scale(1.5);
for (int i=1; i<iterations; i++) {
  tn  = 0.4 - (6 /(1+pow(xn[i-1], 2) + pow(yn[i-1], 2)));
  xn[i] = 1 + u * (xn[i-1]* cos(tn) - yn[i-1]*sin(tn));
  yn[i] = u*( xn[i-1]*sin(tn)+yn[i-1]*cos(tn));

  line(xn[i-1], yn[i-1], xn[i], yn[i]);
}
println("done");

1 Like

i think the main point of this is to have

P starting points ( for inward spirals )
what must be visible in the canvas.

so your x0,y0 start point creation must reflect that you

  • later do a translate to center
  • even use a scale(?)
// IKEDA Function
// https://discourse.processing.org/t/drawing-ikeda-function/9536
// https://en.wikipedia.org/wiki/Ikeda_map#Octave/MATLAB_code_for_point_trajectories

int iterations = 1000;        // line segments
int p =100;                  // starting points
float tn;                    // angle
float u = 0.918;             // ikeda factor
float[] xn = new float[iterations];
float[] yn = new float[iterations];
color cp;

void setup() {
  size(500, 500);
  noLoop();
}

void ikeda() {
  xn[0] = random(-1,1)*width/2;  // related to center translate need all 4 quadrants
  yn[0] = random(-1,1)*height/2; 
  cp = color(random(127,200),random(127,200),random(127,200));
  for (int i=1; i<iterations; i++) {
    tn  = 0.4 - (6 /(1+pow(xn[i-1], 2) + pow(yn[i-1], 2)));
    xn[i] = 1 + u * (xn[i-1]* cos(tn) - yn[i-1]*sin(tn));
    yn[i] = u*( xn[i-1]*sin(tn)+yn[i-1]*cos(tn));
    stroke(cp);
    line(xn[i-1], yn[i-1], xn[i], yn[i]);
  }
}

void draw() {
  background(200,200,0);
  translate(width/2, height/2);
  for ( int k=0; k<p; k++) ikeda();
}

update:
the fun starts if you add this:

void mouseWheel(MouseEvent event) {
  float e = event.getCount();
  u += e*0.02;
  println("ikeda: "+nf(u,1,3));
  redraw();
}

for the mouseWheel plus plus version click

here: SCROLLITIS
// IKEDA Function
// https://discourse.processing.org/t/drawing-ikeda-function/9536
// https://en.wikipedia.org/wiki/Ikeda_map#Octave/MATLAB_code_for_point_trajectories
// v0.1 forum
// v0.2 mouseWheel for u
// v0.3 too slow for many iterations but need for big u ( > 0.95 ) to reach 0,0
// but if x[i] < 1 pix ?0.4? break loop / no need to calculate points * iterations times the 0,0 pixel
// this function has 4 more parameter i want to play with:
// v0.4.3 mousewheel++ SCROLLITIS
// wheel ++ [u] ikeda factor u
// wheel ++ [a][b][c][x]   for function parameter
// wheel ++ [z] zoom / scale(zoom)
// [r] key only : RESET
// key [s] save to data/ikeda_+all parameter+_.png
//

String info = "mouse click canvas &\npress any key and mousewheel redraw with random startpoints\n"+
              "key [u] and wheel u ( ikada factor )\nkey [a] [b] [c] [x]\nkey [z] zoom\nonly key [r] reset, key [s] save PNG";


int p =100;                  // starting points / lines
int iterations = 1000;       // line segments
float tn;                    // angle
float u = 0.9;               // ikeda factor start / see mouseWheel
float tna=0.4, tnb=6, tnc=1, xna=1;
float zoom = 1;  // scale()
float[] xn = new float[iterations];
float[] yn = new float[iterations];
color cp;
String outfilename = "data/";
String param;
String fileext=".png";

void setup() {
  size(500, 500);
  noLoop();
  println(info);
}

void ikeda() {
  xn[0] = random(-1, 1)*width/2;  // related to center translate need all 4 quadrants
  yn[0] = random(-1, 1)*height/2; 
  cp = color(random(127, 200), random(127, 200), random(127, 200));
  for (int i=1; i<iterations; i++) {
    //    tn  = 0.4 - (6 /(1+pow(xn[i-1], 2) + pow(yn[i-1], 2)));
    tn  = tna - (tnb /(tnc+pow(xn[i-1], 2) + pow(yn[i-1], 2)));
    //    xn[i] = 1 + u * (xn[i-1]* cos(tn) - yn[i-1]*sin(tn));
    xn[i] = xna + u * (xn[i-1]* cos(tn) - yn[i-1]*sin(tn));
    yn[i] = u*( xn[i-1]*sin(tn)+yn[i-1]*cos(tn));
    stroke(cp);
    line(xn[i-1], yn[i-1], xn[i], yn[i]);
//    if ( abs(xn[i]) < 0.4 && abs(yn[i]) < 0.4 ) i = iterations;                  // smaller 1 pix, break for loop  ( but not makes it faster )
  }
}

void draw() {
  background(200, 200, 0);
  translate(width/2, height/2);
  scale(zoom);
  for ( int k=0; k<p; k++) ikeda();
}

void savePNG(){
  printparam();                          // also makes the actual param string about the settings (BAD: too many blanks and dots in a filename )
  String out = outfilename+param+fileext;
  save(out);
  println("save : "+out);
}

void mouseWheel(MouseEvent event) {   // mousewheel plus plus SCROLLITIS
  float e = event.getCount();
  if ( keyPressed ) {
    if (  key == 'u' )  u   += e*0.01;
    if (  key == 'a' )  tna += e*0.01;
    if (  key == 'b' )  tnb += e*0.01;
    if (  key == 'c' )  tnc += e*0.01;
    if (  key == 'x' )  xna += e*0.01;
    if (  key == 'z' ) zoom += e*0.1;   // this is not a pure zoom ! it redraws a new random function but same parameter!
    printparam();
    redraw();
  }
}

void keyPressed() {
  if ( key == 'r' ) {
    u = 0.9;               // ikeda factor
    tna=0.4;
    tnb=6;
    tnc=1;
    xna=1;
    zoom=1;
    println("reset:");
    printparam();
    redraw();
  }
  if ( key == 's' ) savePNG();
}

void printparam() {                        //ikeda [u] 0.90 tna [a] 0.40 tnb [b] 6.00 tnc [c] 1.00 xna [x] 1.00 zoom [z] 1.00
     param = 
     "ikeda [u] "+nf(u, 1, 2)+
     " tna [a] "+nf(tna, 1, 2)+
     " tnb [b] "+nf(tnb, 1, 2)+
     " tnc [c] "+nf(tnc, 1, 2)+
     " xna [x] "+nf(xna, 1, 2)+
     " zoom [z] "+nf(zoom, 1, 2);
     println(param); 
}

3 Likes

you are my light @kll !
thanks

1 Like