问题来自于this article,它引用了Notch" Minicraft"中发现的Diamond-square algorithm的实现。完整的源代码可用here。
我不明白用于访问和更改值数组的方法是如何工作的。
给定指定的width
和height
,我们初始化一个名为double
长度为values
的{{1}}的一维数组,并使用以下方法访问并更改点width * height
的值:
(x,y)
我不了解操作的目的public double sample(int x, int y) {
return values[(x & (width - 1)) + (y & (height - 1)) * width];
}
public void setSample(int x, int y, double value) {
values[(x & (width - 1)) + (y & (height - 1)) * width] = value;
}
和x & (width - 1)
,特别是考虑到我的理解y & (height - 1)
和width
应该相等的事实使算法正常工作。如果是这种情况,那么每次操作都不应该返回height
(极端情况除外),因为0
和x < width
?
消息来源提到这些方法具有允许地形完美地包裹在生成的纹理边缘的副作用,但我不明白它是如何实现的。