旋转变换在处理循环中不起作用

时间:2019-07-18 12:37:52

标签: java processing

这是我编写的代码,我打算从单点开始绘制n行。每个分隔开的角度为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, 400, 0);
    }
    //noLoop();
    pop();
}

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

由于某种原因它是错误的,因为它不适用于n=3,5,6,7,9,10..

仅在n为1,2,4,8,16,32...(即只有2的倍数)时有效。

我一定做错了。任何帮助表示赞赏。

如果我做普通的三角函数就可以了。

即通过替换

      rotate(i*(2*PI/n));
      line(0, 0, 400, 0);

作者

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

使用-, =键更改尖峰计数。

2 个答案:

答案 0 :(得分:3)

您的问题是您没有为每个n支臂旋转相同的矩阵量。 您只需删除旋转命令中的i*即可修复代码。

所以

rotate(i*(2*PI/n));
line(0, 0, 400, 0);

应该是

rotate(2*PI/n);
line(0, 0, 400, 0);

如果要使用i*,则每次绘制线条时,不仅要在draw()的开头和结尾,都必须推入并弹出矩阵:

push();
rotate(i*(2*PI/n));
line(0, 0, 400, 0);
pop();

答案 1 :(得分:2)

使用push和pop环绕for循环内的旋转,这样您可以在每次迭代时重置旋转,我尝试了它并使其工作 这是结果代码

   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);
      push();
      rotate(i*(2.0*PI)/n);
      line(0, 0, 400, 0);
      pop();
    }
    pop();

}

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