为什么这个Perlin Noise图像比另一个更平滑?

时间:2017-02-04 23:31:49

标签: java processing visualization noise perlin-noise

Shiffman的Nature of Code练习要求我使用Processing的noise()函数创建Perlin Noise。这是我创建Perlin Noise的代码

 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 Noise。当应用于像素时,像素应该与其周围的像素颜色相似,但它看起来不像我的代码中发生的那样。

1 个答案:

答案 0 :(得分:1)

noise()函数基本上采用2D坐标(或3D坐标,或单个数字,但在您的情况下为2D坐标)并返回基于该坐标的随机数。更靠近的坐标将生成更接近的随机数。

考虑到这一点,请考虑您的代码正在做什么以及教科书正在做什么。教科书根据窗口中的位置以x,y坐标进行输入,这是有意义的,因为这是绘制结果随机值的位置。

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