How to use for loops with transformations in processing?

So this is the code I wrote which I intend to draw n lines starting from a single point. Each separated by an angle of 2*PI / n.

int n;

void setup(){
  size(displayWidth, displayHeight);
  n = 7;
}
void draw(){
    background(0);
    push();
    translate(displayWidth/2, displayHeight/2);
    strokeWeight(4);

    for (int i=0; i < n; i++){
      stroke(random(255), random(255), random(255));
      //println(i);
      //println("theta is", i*(2*PI/n));
      //println("theta in deg is", i*(2*PI/n)*180/PI);
      rotate(i*(2*PI/n));
      line(0, 0, 200 * 2, 0);
    }
    //noLoop();
    pop();
}

void keyPressed(){
  if (key == '='){
    n++;
  } else if (key == '-'){
    n--;
    if (n <= 0) n = 1;
  } 
}

It is wrong for some reason as it doesn’t work for n=3,5,6,7,9,10...
I mean it doesn’t work.

It is working only when n is 1,2,4,8,16,32... i.e. only 2 multiples.

I must be doing something wrong. Any help appreciated.

Use -, = keys to alter the spike count.

1 Like

@gotoloop can you help me?

Sorry, my trigonometry is almost nil. :confounded:

So I replaced these lines with this

line(0, 0, 200 * 2 * cos(i*(2*PI/n)), 200 *2 * sin(i*(2*PI/n)));

i.e. normal polar coordinates (r*cos(a), r*sin(a))

And it works. Anyone knows why rotate didn’t work?

Hello!

Please remember that rotate() in the line rotate(i*(2*PI/n)); adds up the angles

So you have to use push and pop inside the for-loop to avoid the adding up:

(using + and - here)

int n = 7;

void setup() {
  size(displayWidth, displayHeight);
}

void draw() {
  background(0);

  strokeWeight(4);

  for (int i=1; i <= n; i++) {

    stroke(random(255), random(255), random(255));
    pushMatrix();
    translate(displayWidth/2, displayHeight/2);
    //println(i);
    //println("theta is", i*(2*PI/n));
    //println("theta in deg is", i*(2*PI/n)*180/PI);
    rotate(i*(2*PI/n));
    line(0, 0, 200 * 2, 0);
    popMatrix();
  }// for 
  //noLoop();
  fill(255);
  text(n, 33, 33);
}

void keyPressed() {
  if (key == '+') {
    n++;
  } else if (key == '-') {
    n--;
    if (n <= 0) n = 1;
  }
}

OR

you use the fact that rotate() adds up the angles and then you just don’t multiply by i

you just rotate a step further inside the for loop

Chrisir


int n = 7;

void setup() {
  size(displayWidth, displayHeight);
}

void draw() {
  background(0);
  strokeWeight(4);

  pushMatrix();
  translate(displayWidth/2, displayHeight/2);

  for (int i=1; i <= n; i++) {
    stroke(random(255), random(255), random(255));
    rotate(2*PI/n); // !!!!
    line(0, 0, 200 * 2, 0);
  }// for

  popMatrix(); 

  fill(255);
  text(n, 33, 33);
}

void keyPressed() {
  if (key == '+') {
    n++;
  } else if (key == '-') {
    n--;
    if (n <= 0) n = 1;
  }
}
5 Likes

Thank you very much. Now I understand. I thought I was doing push and pop in the loop all this time.

1 Like