刚开始学习Processing的**问题
processing吧
全部回复
仅看楼主
level 2
ywong🐒 楼主
我试试一个noise函数的例子, 这个例子如下
float[] randomY;
float[] noiseY;
float con =1;
void setup(){
size(800,300);
randomY = new float[width];
noiseY = new float[width];
for(int i=0;i<width; i++){
randomY[i] = random(1)*height;
noiseY[i] = noise(i*con)*height;
//println(noiseY[i]);
}
noStroke();
}
void draw(){
background(255);
for(int i=0; i<width; i++){
noiseY[i]=noise(i*con)*height;
//noiseY[i]=noise((i*frameCount)*con)*height;
//noiseY[i]=noise((i*frameCount*0.01)*height;
}
for(int i=0; i<width; i++){
fill(0);
ellipse(i, randomY[i],4,4);
fill(255,0,0);
ellipse(i,noiseY[i],4,4);
}
}
void keyPressed(){
if(keyCode==UP){
con*=10;
}else if(keyCode==DOWN){
con*=0.1;
}
}
问题1:开始运行这个例子, draw()应该是会不停的调用,那画面的点应该是不停的重新画,但运行后画面是能会画出好多黑点和红点,但为什么画面会是静止的;
问题2: 程序中有控制按键调整con的大小,按向下时,con会缩小10倍, 那draw()调用时会执行noise(i*con), 那这时后画面中红色的点会连接为一条连续的曲线,为什么不再会是离散的点,而是连续的曲线?因 int i是1,2,3,等, 那画出的点好像不可能有连续的, 就像我们刚开始运行程序一样,点都是离散的,更改con的值,怎会有这么大的变化
2018年10月21日 10点10分 1
level 2
ywong🐒 楼主
补充一下,在draw()的 for中加入 randomY[i] = random(1)*height, 即是把 randomY数组的数再生产一遍,那这个程序运行起来, 黑色的点是一直会有变化,跳动; 而红色的点一直是静止的,这和noise生产Y坐标有关, 为什么noise生产的坐标在draw再重新运行时会不变,才导致红色的点和或红色的线会一直是静止的,真弄不懂
2018年10月21日 10点10分 2
level 7
Hello,ywong。我想我应该能够回答这个问题。
首先,第一问题,来源于对于数组的理解,其用来存储数据,未经修改,是不会改变的。所以,你在 setup() 方法(该方法在程序中只调用一次)里面对 randomY 和 noiseY 数组进行初始化和赋值后,后续在 draw() 方法中的显示,并不会改变它们保存的数据,画面就会静止了。
至于第二个问题,你得弄懂一维的Perlin噪声。我们需要在 noise() 中输入时间值,而倘若这个时间值不变,noise() 返回的结果也是相同的。这也是为什么 con 不变,红点亦不会移动的原因。至于为什么会有直线、曲线、离散的点,这是因为我们输入时间值增大的速度会影响噪声的平滑度,所以才会出现这三个状态。也就是说,作为一般规则,坐标之间的差异越小,产生的噪声序列越平滑。这同样解释了:当 con 达到很大值之后,会出现直线的情况。
2018年10月22日 06点10分 3
谢谢你; 我也现在弄清楚, noise()在程序运行中,如果其参数不变,noise的值也不变; 如是重新运行,noise的值就不相同; noise(t)里t越小,值的分布就越接近,就出现点连成线的视觉
2018年10月22日 08点10分
level 7
欢迎关注
Hewes 的知乎专栏:Hewes的编程艺术(https://zhuanlan.zhihu.com/c_123529691
Hewes 的CSDN博客:https://blog.csdn.net/Hewes
Let's enjoy creative programming!
2018年10月22日 06点10分 4
1