我环顾四周,似乎最常用于纹理,我发现自己一直试图弄清楚如何将Perlin / Simplex Noise实现为一组二维坐标x和y。
我要做的就是输入2个随机坐标,x&然后它返回一个改变的x&是,或者这不可能?
我正在使用pythons noise来创建坐标,但我发现自己认为perlin噪声非常复杂,无法完全理解它是如何工作的。
答案 0 :(得分:2)
可以使用Perlin Noise为2D坐标集合添加一些不确定性(如果集合是一对,那也很好)。您可以考虑返回的噪声值(在指向库的[-1,1]范围内)以及一些因子来确定它对输入坐标的影响程度。因子越大,噪声对数据的影响越大。这是最简单的例子之一:
from noise import snoise2 # Simplex noise for 2D points
x, y = 0.5, 0.3
factor = 0.1
n = snoise2(x, y)
print x + n * factor, y + n * factor
我们还可以考虑更大的因素,并将相同的想法应用于图像。考虑factor = 15
并将生成的坐标舍入到最近的邻居,我们从左边的图像到右边的图像:
以下是获取图像的完整代码。因素n1
和n2
用于获得“不那么无聊”的图像。
import sys
from noise import snoise2
from PIL import Image
img = Image.open(sys.argv[1]).convert('L')
result = Image.new('L', img.size)
width, height = img.size
factor = 15
res = result.load()
im = img.load()
for x in xrange(width):
for y in xrange(height):
n1 = snoise2(x, y)
n2 = snoise2(y, x)
pt = [int(round(x + n1 * factor)), int(round(y + n2 * factor))]
pt[0] = min(max(0, pt[0]), width - 1)
pt[1] = min(max(0, pt[1]), height - 1)
res[x, y] = im[tuple(pt)]
result.save(sys.argv[2])
当然,这甚至没有考虑如何使用Perlin Noise。作为另一个例子,给定某个函数,您可以“noisify”输入并与提到的因子结合以创建不同的输出。例如,这是基于余弦的某些函数执行此操作的结果: