【发布时间】:2020-08-24 21:48:12
【问题描述】:
我一直在用 python 实现一个 perlin noice 生成器。 它工作得很好,除了结果中的线条清晰可见。
问题似乎与我在 X 方向的渐变之间切换的位置有关。
代码如下:
from random import randint, seed
from PIL import Image
from numpy import asarray, interp, uint8
seed(1)
gradients = []
for x in range(20):
gradients.append([])
for y in range(20):
gradients[x].append([randint(-1,1), randint(-1,1)])
def getInfluenceValue(x,y,Xgrad,Ygrad):
return ((gradients[Xgrad][Ygrad][0] * (x-Xgrad)) + (gradients[Xgrad][Ygrad][1]*(y-Ygrad)))
def lerp(v0,v1,t):
return (1 - t) * v0 + t * v1;
def fade(t):
return 3*pow(t,2) - 2*pow(t,3)
def perlin(x, y):
X0 = int(x)
Y0 = int(y)
X1 = X0+1
Y1 = Y0+1
sx = fade(float(x) - float(X0));
sy = fade(float(y) - float(Y0));
topLeftDot = getInfluenceValue(x,y,X0,Y1)
topRightDot = getInfluenceValue(x,y,X1,Y1)
bottomLeftDot = getInfluenceValue(x,y,X0,Y0)
bottomRightDot = getInfluenceValue(x,y,X1,Y0)
return lerp(lerp(topLeftDot, topRightDot, sx), lerp(bottomLeftDot, bottomRightDot, sx), sy)
tmp_list = []
for x in range(1000):
tmp_list.append([])
for y in range(1000):
tmp_list[x].append(perlin(x/100.0, y/100.0))
data = asarray(tmp_list)
rescaled = interp(data, (data.min(), data.max()), (0, 255)).astype(uint8)
Image.fromarray(rescaled).save('test.png')
结果如下:
我已经尝试替换 lerp 功能,并且我使用了其他淡入淡出功能。但问题依然存在。这是怎么回事?
PS。我在 stackoverflow 上看到了其他关于“块状”导致 perlin 噪声生成的问题,但由于这个结果似乎只是在 1 个方向/维度上是“块状”的,我认为这个问题与这些问题无关。
【问题讨论】:
-
您基本上是在寻求帮助调试您的代码的人。如果您至少添加一个关于您的代码做什么(或试图做什么)的概述,那将会很有帮助。
标签: python numpy perlin-noise