2017-02-04 115 views
0

在Shiffman的Nature of Code中练习,要求我使用Processing的noise()函数创建Perlin Noise。这里是我的代码,我做了创建柏林噪声为什么Perlin噪声图像比其他图像更平滑?

float xSpace = 0; // Signifies "space" between noise() values on the x coordinate. 
float ySpace = 0; // Signifies "space" between noise() values on the y coordinate. 


void setup(){ 
    size(500,500); 
    background(0); 
    loadPixels(); 

    for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
     float bright = map(noise(xSpace,ySpace),0,1,0,255); 
     pixels[(y * width) + x] = color(bright); 
     //Each pixel in the pixels[] array is a color element. 
     ySpace = ySpace + 0.01; 
    } 
    xSpace = xSpace + 0.01 ; 
    } 
    updatePixels(); 
} 

当我跑我的代码,它像这样

mySolution

我看着教科书的解决方案创建的图像。教科书的解决方案和我的解决方案几乎完全相同,只是教科书在外循环的每次迭代中将ySpace重新初始化为0

// Textbook's solution 

     for(int x = 0; x < width; x++) { 
      ySpace = 0; 
     for(int y = 0; y < height; y++) { 
      float bright = map(noise(xSpace,ySpace),0,1,0,255); 
      pixels[(y * width) + x] = color(bright); 
      ySpace = ySpace + 0.01; 
     } 
     xSpace = xSpace + 0.01 ; 
     } 

然而,当我运行教科书的代码,该代码创建这样

textbookSolution

为什么,当ySpace在外环被重新初始化一个更平滑的图像,并在图像出来比当它不是更平滑?换句话说,为什么教科书的代码比我的代码创造出更平滑的图像?

我注意到一旦for循环完成,我代码中的ySpace将比教科书代码中的ySpace大得多。但我不确定这是为什么我的代码图像不够流畅。根据我的理解,噪声(x,y)会产生2d Perlin噪声。应用于像素时,像素应该与其周围像素的颜色相似,但看起来不像它在我的代码中发生的那样。

+1

不知道这里的问题是什么。您更改了算法的基本参数,并且当结果与未修改的算法不匹配时会感到惊讶。请注意,本书的代码不会“在第一个循环中初始化'ySpace'” - 它会在外循环的_every_迭代中将该值初始化为零。 –

+0

好的,我编辑了我的帖子以纠正我的错误。 “ySpace”的重新初始化是为什么教科书的图像比我的平滑得多? –

回答

1

noise()函数本质上需要一个二维坐标(或三维坐标,或一个单一的数字,但在你的情况下是二维坐标),并返回一个基于该坐​​标的随机数。靠得更近的坐标将生成更接近的随机数。

考虑到这一点,想想你的代码在做什么和教科书在做什么。教科书基于窗口中的位置输入x,y坐标,这是合理的,因为这是绘制结果随机值的地方。

但是无论如何,您的代码都会不断增加y坐标。这可能是有意义的,如果你只有一列像素只是不断下降,但你想循环在屏幕上的像素。