Algorithm 用于Dart实现的柏林噪声失败

Algorithm 用于Dart实现的柏林噪声失败,algorithm,dart,perlin-noise,Algorithm,Dart,Perlin Noise,所以在过去的几个小时里,我一直在尝试在Dart中制作一个简单的柏林噪声发生器。为此,我决定在上使用psuedo代码进行2d生成(很棒的阅读!) 这就是我的Dart实现的样子: 不幸的是,当我渲染到画布时,我只得到随机生成的对角线,如下图所示: 为了渲染图像,我使用了以下脚本: void main() { PerlinNoise p = new PerlinNoise(octaves:5); CanvasElement c = query('canvas'); CanvasRende

所以在过去的几个小时里,我一直在尝试在Dart中制作一个简单的柏林噪声发生器。为此,我决定在上使用psuedo代码进行2d生成(很棒的阅读!)

这就是我的Dart实现的样子:

不幸的是,当我渲染到画布时,我只得到随机生成的对角线,如下图所示:

为了渲染图像,我使用了以下脚本:

void main() {
  PerlinNoise p = new PerlinNoise(octaves:5);
  CanvasElement c = query('canvas');
  CanvasRenderingContext2D con = c.context2D;
  ImageData id= con.createImageData(1,1);
  List d= id.data;
  d[3]=255;  
  for (var i=0;i<c.width;i++) {
    for (var j=0;j<c.height;j++) {
      int val = (p.perlinNoise(i.toDouble(), j.toDouble())*200).toInt();
      d[0] = val;
      d[1] = val;
      d[2] = val;
      con.putImageData(id, i, j);
    }
  }
}
void main(){
PerlinNoise p=新PerlinNoise(八度:5);
CanvasElement c=查询('canvas');
CanvasRenderingContext2D con=c.context2D;
ImageData id=con.createImageData(1,1);
列表d=id.data;
d[3]=255;

对于(var i=0;i我在代码中看到了一些问题:

  • 第42行:应该是
    double fracY=y-intY;
    而不是
    double fracY=x-intY;
  • 您的
    \u noise
    函数是对称的:
    \u noise(x,y)==\u noise(y,x)
    。本文使用了非对称的
    x+y*57
  • 快速阅读后,我了解到
    \u interpolatedNoise
    \u smoothNoise
    \u noise
    应采用额外的
    I
    参数
每次迭代调用不同的噪波函数,用Noisei表示

编辑:以下是实现2D柏林噪波的尝试:

  • 我更改了
    \u noise
  • perlinNoise
    需要使用介于0和1之间的号码进行呼叫(请参见
    main
导入'dart:html';
导入'dart:math'作为数学;
类柏林噪声{
八度音阶;
双重坚持;
Map_noises={};
final _rand=新的Math.Random();
PerlinNoise({int八度音阶:1,双持久性:1.0}):
_八度音阶=八度音阶,
_坚持=坚持;
双噪声(整数i、整数x、整数y)=>
_噪声。putIfAbsent(i,()=>{})
.putIfAbsent(x,()=>{})
.putIfAbsent(y,()=>2*_rand.nextDouble()-1);
双平滑噪声(整数i、整数x、整数y){
双角=(_噪声(i,x-1,y-1)+
_噪声(i,x+1,y-1)+
_噪声(i,x-1,y+1)+
_噪声(i,x+1,y+1))/16;
双面=(_噪声(i,x-1,y)+
_噪声(i,x+1,y)+
_噪音(i,x,y-1)+
_噪声(i,x,y+1))/8;
双中心=_噪声(i,x,y)/4;
返回角+边+中心;
}
双插值(双a、双b、双x){
双ft=x*Math.PI;
双f=(1-数学cos(ft))*0.5;
返回a*(1-f)+b*f;
}
双插值噪波(整数i,数值x,数值y){
intX=x.floor();
int intY=y.floor();
双分形=(x-intX).toDouble();
双分形=(y-intY).toDouble();
双v1=_平滑噪声(i,intX,intY);
双v2=_平滑噪声(i,intX+1,intY);
双v3=_平滑噪声(i,intX,intY+1);
双v4=_平滑噪声(i,intX+1,intY+1);
双i1=_插值(v1,v2,fracX);
双i2=_插值(v3,v4,fracX);
返回插值(i1,i2,分形);
}
双perlinNoise(数量x,数量y){
var合计=0;
对于(var i=0;i<_倍频程;i++){
int频率=数学功率(2,i);
双振幅=数学功率(_,i);
总+=\u插值噪声(i,x*频率,y*频率)*振幅;
}
返回总数;
}
}
void main(){
PerlinNoise p=新的PerlinNoise(八度:5,持续性:0.9);
CanvasElement c=查询('canvas');
CanvasRenderingContext2D con=c.context2D;
ImageData id=con.createImageData(1,1);
列表d=id.data;
d[3]=255;
对于(变量i=0;i
Nice one!这让我更接近实际结果。谢谢!不过,修复并没有真正给出想要的结果。正如您可能已经注意到的,我正试图使用种子来控制随机性,但在我的新版本中,它看起来似乎不正确。新版本:我用一些似乎有效的东西更新了答案。干杯:)