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

rotate transformation doesn't work in processing for loop

这是我编写的代码,我打算从一个点开始绘制 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)));

使用 -, = 键改变峰值计数。

用 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;
  } 
}

你的问题是你没有为每个 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();