diff --git a/src/experimental/reaction_diffusion.scad b/src/experimental/reaction_diffusion.scad index e2970765..cecfb8f3 100644 --- a/src/experimental/reaction_diffusion.scad +++ b/src/experimental/reaction_diffusion.scad @@ -18,13 +18,13 @@ function init(x, y, n, ix, iy, in) = ] ]; -function gray_scott(u, v, feel, kill, Du, Dv, space_x, space_y) = +function gray_scott(u, v, feel, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y) = let( nuv = [ for(y = [0:space_y - 1]) let( - uy = (y + 1 + space_y) % space_y, - ly = (y - 1 + space_y) % space_y, + uy = uy_ly[y][0], + ly = uy_ly[y][1], row_u = u[y], row_v = v[y], row_uu = u[uy], @@ -35,36 +35,46 @@ function gray_scott(u, v, feel, kill, Du, Dv, space_x, space_y) = [ for(x = [0:space_x - 1]) let( + rx = rx_lx[x][0], + lx = rx_lx[x][1], cu = row_u[x], cv = row_v[x], - rx = (x + 1 + space_x) % space_x, - lx = (x - 1 + space_x) % space_x, reaction = cu * (cv ^ 2) ) [ - Du * (row_uu[x] + row_u[rx] + row_ul[x] + row_u[lx] - 4 * cu) - reaction + feel * (1 - cu), - Dv * (row_vu[x] + row_v[rx] + row_vl[x] + row_v[lx] - 4 * cv) + reaction - (feel + kill) * cv + cu + Du * (row_uu[x] + row_u[rx] + row_ul[x] + row_u[lx] - 4 * cu) - reaction + feel * (1 - cu), + cv + Dv * (row_vu[x] + row_v[rx] + row_vl[x] + row_v[lx] - 4 * cv) + reaction - (feel + kill) * cv ] ] ] ) [ - u + [for(row = nuv) [for(uv = row) uv[0]]], - v + [for(row = nuv) [for(uv = row) uv[1]]] + [for(row = nuv) [for(uv = row) uv[0]]], + [for(row = nuv) [for(uv = row) uv[1]]] ]; -function _reaction_diffusion(feel, kill, generation, u, v, Du, Dv, space_x, space_y) = +function _reaction_diffusion(feel, kill, generation, u, v, Du, Dv, uy_ly, rx_lx, space_x, space_y) = generation == 0 ? [u, v] : - let(nuv = gray_scott(u, v, feel, kill, Du, Dv, space_x, space_y)) - _reaction_diffusion(feel, kill, generation - 1, nuv[0], nuv[1], Du, Dv, space_x, space_y); + let(nuv = gray_scott(u, v, feel, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y)) + _reaction_diffusion(feel, kill, generation - 1, nuv[0], nuv[1], Du, Dv, uy_ly, rx_lx, space_x, space_y); function reaction_diffusion( feel, kill, generation, space_size = [50, 50], init_size = [10, 10], init_u = 0.5, init_v = 0.25, Du = 0.2, Dv = 0.1) = let( - u = init(space_size[0], space_size[1], 1, init_size[0], init_size[1], init_u), - v = init(space_size[0], space_size[1], 0, init_size[0], init_size[1], init_v) + space_x = space_size.x, + space_y = space_size.y, + u = init(space_x, space_y, 1, init_size.x, init_size.y, init_u), + v = init(space_x, space_y, 0, init_size.x, init_size.y, init_v), + uy_ly = [ + for(y = [0:space_y - 1]) + [(y + 1 + space_y) % space_y, (y - 1 + space_y) % space_y] + ], + rx_lx = [ + for(x = [0:space_x - 1]) + [(x + 1 + space_x) % space_x, (x - 1 + space_x) % space_x] + ] ) - _reaction_diffusion(feel, kill, generation, u, v, Du, Dv, space_size[0], space_size[1]); + _reaction_diffusion(feel, kill, generation, u, v, Du, Dv, uy_ly, rx_lx, space_x, space_y); /*