这是我编写的代码,我打算从单点开始绘制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)));
使用-, =
键更改尖峰计数。
答案 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;
}
}