这是我编写的代码,我打算从一个点开始绘制 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)));
使用 -, =
键来改变峰值计数。
最佳答案
你的问题是你没有为每个 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();
关于java - 旋转变换在处理循环时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094648/