collatz

maths i guess

// made by alex
// iamalexbaker@gmail.com

// https://en.wikipedia.org/wiki/Collatz_conjecture

int do_draw = 1;
float[] len = {5, 5};
float angle = PI/32;
int start = 10000000;
int num = 8000;
PVector origin;
int n_sets = 1;
color[] c = new color[n_sets];
float colour_spread = 40;
void setup() {
  size(800, 800);
  strokeWeight(1);
  origin = new PVector(width, 0);
  for (int i = 0; i < n_sets; i++) {
    c[i] = dullColour(colour_spread);
  }
}

void draw() {
  if (do_draw == 0) return;
  background(50);

  //start += 10;
  //angle += random(-PI/128, PI/128);

  //translate(width/2, height);
  stroke(255,10);
  cycle(start, start+num, angle, 0, origin);
  //stroke(40,0,40,10);
  //cycle(start+num, start+num*2, angle, PI/2, origin);
  //stroke(180,230,255,5);
  //cycle(start+num*2, start+num*3, 4*angle/6, PI/2);
  
  //for (int i = 0; i < n_sets; i++)
  //{
  //  stroke(0, 10);
  //  cycle(start+num*i, start+num*(i+1), angle, (TWO_PI/n_sets)*i, origin);
  //}

  do_draw = 0;
}

void cycle(int s, int e, float a, float r, PVector o)
{
  for (int i = s; i < e; i++) {
    LongList seq = new LongList();
    resetMatrix();
    translate(o.x, o.y);
    rotate(r);
    long n = i;
    int steps = 0;
    do {
      seq.append(n);
      n = collatz(n);
      steps++;
    } while (n != 1);
    seq.append(1);
    seq.reverse();
    for (int j = 0; j < seq.size(); j++)
    {
      long value = seq.get(j);
      if (value % 2 == 0) {
        rotate(a);
      } else {
        rotate(-a);
      }
      float l = random(len[0], len[1]);

      line(0, 0, 0, l);
      translate(0, l);
    }
  }
}

long collatz(long n) {
  if (n % 2 == 0) {
    return n / 2;
  } else {
    return (3*n + 1) / 2;
  }
}

void keyPressed()
{
  if (keyCode==32) {
    saveFrame("collatz-"+hour()+"-"+minute()+"-"+second()+".png");
  }
  if (keyCode==10) {
    setup();
  }
}

color dullColour(float spread)
{
  color col;
  float x = random(255);
  col = color(constrain(x + random(spread) - spread/2, 0, 255), constrain(x + random(spread) - spread/2 + 40, 0, 255), constrain(x + random(spread) - spread/2, 0, 255));
  return col;
}

Leave a comment