Julia插值梯度噪声
我试图实现和学习代码,但我有插值它的问题。这是我在Julia中实现的代码:Julia插值梯度噪声,julia,perlin-noise,Julia,Perlin Noise,我试图实现和学习代码,但我有插值它的问题。这是我在Julia中实现的代码: lerp(a, b, w) = a * (1 - w) + b * w function Noise(x, y) n = x + y * 53; n = (n << 13) $ n; return (1.0 - ( (n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0); end
lerp(a, b, w) = a * (1 - w) + b * w
function Noise(x, y)
n = x + y * 53;
n = (n << 13) $ n;
return (1.0 - ( (n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
end
function coherentNoise(x,y)
x₁ = convert(Int64,modf(x)[2])
y₁ = convert(Int64,modf(y)[2])
xᵣ = x - x₁
yᵣ = y - y₁
q1 = Noise(x₁-1,y₁+1)
q2 = Noise(x₁+1,y₁+1)
q3 = Noise(x₁-1,y₁-1)
q4 = Noise(x₁-1,y₁+1)
v = lerp(q1,q2,xᵣ)
v1 = lerp(q3,q4,xᵣ)
return abs(lerp(v,v1,yᵣ))
#value = bilinear(q1,q2,q3,q4,x₁,x₁-1,x₁+1,y₁,y₁-1,y₁+1)
#return abs(value)
end
arr = Array{Float64}(height,width)
for x = 1:height
for y = 1:width
nx = x/60
ny = y/60
arr[x,y]=coherentNoise(nx,ny)
end
end
结果是:
我不知道是杂音
函数有问题还是其他问题
更新
我使用双线性插值和下一个噪波发生器函数获得最佳结果:
function coherentNoise(x,y,n::Int64)
#octa3e
o = 0.25
#octave x and y
x /=n
y /=n
#decimal value
x₁ = x < 0 ? x : x-o
y₁ = y < 0 ? y : y-o
x₂ = x+o
y₂ = y+o
#calculate corners data
q1 = abs(Noise(floor(Int64,x₁),floor(Int64,y₂)))
q2 = abs(Noise(floor(Int64,x₂),floor(Int64,y₂)))
q3 = abs(Noise(floor(Int64,x₁),floor(Int64,y₁)))
q4 = abs(Noise(floor(Int64,x₂),floor(Int64,y₁)))
#bilenear interpolation
value = bilinear(q2,q1,q4,q3,x,x₁,x₂,y,y₁,y₂)
return abs(value)
end
更新3
感谢你的回答,我得到了更好的输出,但是有一些奇怪的“蠕虫”
输出:
如果没有测试代码的能力,这应该需要验证。基本上,我认为你的直觉问题在于插值点的选择是正确的。这是试图修复它(另请参见注释) 注:
s重命名为q
,以指示偏移到X(第一个数字)和Y(第二个数字)的角点李>q00
- 相同的
和q1
已修复q4
- 使用
和floor
代替mod(,1)
,因为它们选择一致的舍入方向(向下),而不考虑符号modf
函数应键入注释其参数以限制为Int32值,而Noise
函数代码>在该函数的行尾不需要。这是一个散列函数,同样的效果可以用Julia散列函数和一个小包装器轻松编码李>
Noise(x,y) = 1.0-2.0*hash((x,y))/typemax(UInt)
是一款更具Julia风格的drop-in,取代了噪音
如果您尝试此方法并对错误进行注释,我们可以尝试修复此函数。您介意显示生成这些绘图的代码吗?:)@我在更新2中添加了它。在第一个列表的
coherentNoise(x,y)
中,q1=Noise(x₁-1,y₁+1)
应为q1=噪声(x₁,,Y₁+1)
不带-1
。x₁代码>和y₁当x
和y
变化缓慢时,代码>一步一步,目标是从1个单位平方而不是2个单位平方的角点插值Noise
函数(同样适用于以下类似行)。在第一个列表中的coherentNoise(x,y)
中,q1
和q4
是相同的,应该是不同的角落。好啊答案中包含对相干噪声的重写。@DanGetz感谢您的帮助!现在我得到了平滑的结果,但有些古怪。将更新问题。谢谢你的噪音功能。更新了,我不知道为什么我会收到这种“蠕虫”噪音。必须是插值技术,如果你看到第一个列表蠕虫也存在。那么,为什么不使用第一次更新时的双线性插值呢?
for x = 1:height
for y = 1:width
arr[x,y]=coherentNoise(x,y,50)
end
end
imwrite(convert(Image,arr),"desktop/projects/julia/Noise/test2.png")
function coherentNoise(x,y)
x₁,xᵣ = floor(Int64,x),mod(x,1)
y₁,yᵣ = floor(Int64,y),mod(y,1)
q00 = Noise(x₁,y₁)
q10 = Noise(x₁+1,y₁)
q01 = Noise(x₁,y₁+1)
q11 = Noise(x₁+1,y₁+1)
v0 = lerp(q00,q10,xᵣ)
v1 = lerp(q01,q11,xᵣ)
noise = lerp(v0,v1,yᵣ)
return noise
end
Noise(x,y) = 1.0-2.0*hash((x,y))/typemax(UInt)