你知道四个角上的rgb值,所以,为了能够创建一个彩色地图,你只需要一个函数来获取一个坐标
(x,y)
(其中
x
和
y
在范围之内
0
到
1
)并返回该坐标处的rgb值。
为此,我们需要实施
bilinear interpolation
它是线性插值到二维插值的扩展。
通过在顶部两个角之间进行插值,然后使用底部两个角之间的插值结果插值,来执行双线性插值。
a ----|---- b
|
|
c ----|-----d
所以在我们编写主函数之前,我们首先需要一个助手来执行插值,因为我们将使用它九次。
这可能是线性的:
def lerp(x, a, b):
return a + x * (b-a)
或者更光滑的东西,比如
smoothstep
功能:
def serp(x, a, b):
return a + (3*x**2 - 2*x**3) * (b-a)
(结果是,在这种情况下,我们只需要走到拐角处(而不是像用柏林噪声发生器那样的山丘),线性会产生一个更渐变的梯度!)
该函数将四个rgb值作为四个长度的list/numpy数组
3
(
a
,请
b
我是说,
c
,请
d
)还有坐标(
十
我是说,
是的
)返回该坐标处的rgb值。
def get_color(x, y, a, b, c, d):
r = lerp(y, lerp(x, a[0], b[0]), lerp(x, c[0], d[0]))
g = lerp(y, lerp(x, a[1], b[1]), lerp(x, c[1], d[1]))
b = lerp(y, lerp(x, a[2], b[2]), lerp(x, c[2], d[2]))
return np.array([r, g, b])
或者,我们可以用一个列表来让它更像蟒蛇:
def get_color(x, y, a, b, c, d):
return np.array([lerp(y, lerp(x, a[i], b[i]),
lerp(x, c[i], d[i])) for i in range(3)])
现在我们只需要在一个可以使用的numpy数组上计算这个值
np.meshgrid
对于(请参见
this question
对于其他方法)。
哦,我会和
matplotlib
因为我没有
OpenCV
安装!
import matplotlib.pyplot as plt
import numpy as np
w = h = 200
verts = [[255,0,0],[0,255,0],[0,0,255],[255,0,0]]
img = np.empty((h,w,3), np.uint8)
for y in range(h):
for x in range(w):
img[y,x] = get_color(x/w, y/h, *verts)
plt.imshow(img)
plt.show()
它给出了以下图像:
这种技术也用于
perlin noise
让我创造了这个
terrain generator
是的。