1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-20 05:21:38 +02:00

refactor: reuse uy_ly rx_lx

This commit is contained in:
Justin Lin
2022-04-15 19:00:33 +08:00
parent 802bc6f8eb
commit 2227f8b95e

View File

@@ -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);
/*