代码之家  ›  专栏  ›  技术社区  ›  mdomino

如何将未失真的2D柏林噪声作为p5中的图像。js?

  •  1
  • mdomino  · 技术社区  · 8 年前

    我试图在p5中绘制柏林噪声图像。js。我遵循了Daniel Shiffman的教程,他给出了一个关于如何设置2D柏林噪声的示例 here (为了方便起见,我已将此加载到 this JSFiddle sketch

    现在我不需要整个画布充满柏林噪声,但我只需要柏林噪声的(较小)图像,我可以像画布中的图像文件一样使用。所以,在我使用的设置函数中 createImage() 然后使用完全相同的算法将柏林噪声加载到图像中。然而,当我现在显示它时,噪声看起来完全失真。

    // noise code originally by
    // Daniel Shiffman
    // http://codingtra.in
    // http://patreon.com/codingtrain
    // Code for: https://youtu.be/ikwNrFvnL3g
    
    var inc = 0.01;
    var noiseImg;
    
    function setup() {
      createCanvas(640, 360);
      pixelDensity(1);
        background("red");
    
      var yoff = 0;
        noiseImg = createImage(200, 200);
      noiseImg.loadPixels();
      for (var y = 0; y < height; y++) {
        var xoff = 0;
        for (var x = 0; x < width; x++) {
          var index = (x + y * width) * 4;
          var r = noise(xoff, yoff) * 255;
          noiseImg.pixels[index + 0] = r;
          noiseImg.pixels[index + 1] = r;
          noiseImg.pixels[index + 2] = r;
          noiseImg.pixels[index + 3] = 255;
          xoff += inc;
        }
        yoff += inc;
      }
      noiseImg.updatePixels();
    }
    
    function draw() {
      image(noiseImg, 0, 0);
    }
    

    JSFiddle

    有人知道为什么它是扭曲的,虽然噪声算法没有改变,我可以做什么呢?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Kevin Workman    8 年前

    这个 width height 640 360 分别地使用这些变量循环该空间中的每个像素,然后设置仅为 200 通过 300 300

    这就是造成失真的原因:你在画一个 640x360 柏林噪声图 200x200 形象这会导致一些未定义的行为,表现为您看到的失真。

    要解决这个问题,只需在图像的边界上循环,而不是草图本身。