Algorithm 用于Dart实现的柏林噪声失败
所以在过去的几个小时里,我一直在尝试在Dart中制作一个简单的柏林噪声发生器。为此,我决定在上使用psuedo代码进行2d生成(很棒的阅读!) 这就是我的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
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!这让我更接近实际结果。谢谢!不过,修复并没有真正给出想要的结果。正如您可能已经注意到的,我正试图使用种子来控制随机性,但在我的新版本中,它看起来似乎不正确。新版本:我用一些似乎有效的东西更新了答案。干杯:)