Diamond-Square算法:如何确定运行钻石函数和正方形函数所需的瓷砖?

我正在开发一款钻石-正方形高度图生成器,并且在某个特定部分已经卡了一段时间了。

我无法确定我需要在哪些瓷砖上运行square()函数,以及我需要在哪些瓷砖上运行diamond()函数。

我查看了此指南:http://www.playfuljs.com/realistic-terrain-in-130-lines/ 并且我以他们使用的for循环为例,但它似乎完全没用。

答案的首选语言是Lua(或只需指出正确的方向)。我只需要有人告诉我如何获得适用于钻石和正方形函数的for循环。

点赞
用户6834680
用户6834680

高度约束

local min_height = 10 local max_height = 100

网格

local K = 4 local M = 2^K # 场地是循环整数网格 0 <= x,y < M (x=M 即为 x=0) local heights = {} # min_height <= heights[x][y] <= max_height for x = 0, M-1 do heights[x] = {} end

设置四个角的高度(由于循环场地,所有 4 个角都是同一点)

heights[0][0] = (min_height + max_height) / 2

local delta_height = (max_height - min_height) * 0.264 local side = M local sqrt2 = 2^0.5

repeat local dbl_side = side side = side/2

正方形

for x = side, M, dbl_side do for y = side, M, dbl_side do local sum = heights[(x-side)%M][(y-side)%M] + heights[(x-side)%M][(y+side)%M] + heights[(x+side)%M][(y-side)%M] + heights[(x+side)%M][(y+side)%M] heights[x][y] = sum/4 + (2*math.random()-1) * delta_height end end delta_height = delta_height / sqrt2

菱形

for x = 0, M-1, side do for y = (x+side) % dbl_side, M-1, dbl_side do local sum = heights[(x-side)%M][y] + heights[x][(y-side)%M] + heights[x][(y+side)%M] + heights[(x+side)%M][y] heights[x][y] = sum/4 + (2*math.random()-1) * delta_height end end delta_height = delta_height / sqrt2 until side == 1

绘制场地

for x = 0, M-1 do local s = '' for y = 0, M-1 do s = s..' '..tostring(math.floor(heights[x][y])) end print(s) end

2018-08-16 10:04:28