mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-09 16:26:47 +02:00
refactor: return uv
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
function init(x, y, n, ix, iy, in) =
|
function init(x, y, ix, iy, init_u, init_v) =
|
||||||
let(
|
let(
|
||||||
half_x = floor(x / 2),
|
half_x = floor(x / 2),
|
||||||
half_y = floor(y / 2),
|
half_y = floor(y / 2),
|
||||||
@@ -14,19 +14,19 @@ function init(x, y, n, ix, iy, in) =
|
|||||||
[
|
[
|
||||||
for(i = [0:x - 1])
|
for(i = [0:x - 1])
|
||||||
i >= lowx && i < highx && j >= lowy && j < highy ?
|
i >= lowx && i < highx && j >= lowy && j < highy ?
|
||||||
in : n
|
[init_u, init_v] : [1, 0]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
function gray_scott(uv, feel, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y) =
|
function gray_scott(uv, feed, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y) =
|
||||||
[
|
[
|
||||||
for(y = [0:space_y - 1])
|
for(y = [0:space_y - 1])
|
||||||
let(
|
let(
|
||||||
uy = uy_ly[y][0],
|
uy = uy_ly[y][0],
|
||||||
ly = uy_ly[y][1],
|
ly = uy_ly[y][1],
|
||||||
ruv = uv[y],
|
ruv = uv[y],
|
||||||
ruv_u = uv[uy],
|
ruv_u = uv[uy_ly[y][0]],
|
||||||
ruv_l = uv[ly]
|
ruv_l = uv[uy_ly[y][1]]
|
||||||
)
|
)
|
||||||
[
|
[
|
||||||
for(x = [0:space_x - 1])
|
for(x = [0:space_x - 1])
|
||||||
@@ -38,32 +38,23 @@ function gray_scott(uv, feel, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y) =
|
|||||||
reaction = cu * (cv ^ 2)
|
reaction = cu * (cv ^ 2)
|
||||||
)
|
)
|
||||||
[
|
[
|
||||||
cu + Du * (ruv_u[x][0] + ruv[rx][0] + ruv_l[x][0] + ruv[lx][0] - 4 * cu) - reaction + feel * (1 - cu),
|
cu + Du * (ruv_u[x][0] + ruv[rx][0] + ruv_l[x][0] + ruv[lx][0] - 4 * cu) - reaction + feed * (1 - cu),
|
||||||
cv + Dv * (ruv_u[x][1] + ruv[rx][1] + ruv_l[x][1] + ruv[lx][1] - 4 * cv) + reaction - (feel + kill) * cv
|
cv + Dv * (ruv_u[x][1] + ruv[rx][1] + ruv_l[x][1] + ruv[lx][1] - 4 * cv) + reaction - (feed + kill) * cv
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
function _reaction_diffusion(feel, kill, generation, uv, Du, Dv, uy_ly, rx_lx, space_x, space_y) =
|
function _reaction_diffusion(feed, kill, generation, uv, Du, Dv, uy_ly, rx_lx, space_x, space_y) =
|
||||||
generation == 0 ? uv :
|
generation == 0 ? uv :
|
||||||
let(nuv = gray_scott(uv, feel, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y))
|
let(nuv = gray_scott(uv, feed, kill, Du, Dv, uy_ly, rx_lx, space_x, space_y))
|
||||||
_reaction_diffusion(feel, kill, generation - 1, nuv, Du, Dv, uy_ly, rx_lx, space_x, space_y);
|
_reaction_diffusion(feed, kill, generation - 1, nuv, Du, Dv, uy_ly, rx_lx, space_x, space_y);
|
||||||
|
|
||||||
function reaction_diffusion(
|
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) =
|
feed, 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(
|
let(
|
||||||
space_x = space_size.x,
|
space_x = space_size.x,
|
||||||
space_y = space_size.y,
|
space_y = space_size.y,
|
||||||
u = init(space_x, space_y, 1, init_size.x, init_size.y, init_u),
|
uv = init(space_x, space_y, init_size.x, init_size.y, init_u, init_v),
|
||||||
v = init(space_x, space_y, 0, init_size.x, init_size.y, init_v),
|
|
||||||
uv = [
|
|
||||||
for(y = [0:space_y - 1])
|
|
||||||
let(ru = u[y], rv = v[y])
|
|
||||||
[
|
|
||||||
for(x = [0:space_x - 1])
|
|
||||||
[ru[x], rv[x]]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
uy_ly = [
|
uy_ly = [
|
||||||
for(y = [0:space_y - 1])
|
for(y = [0:space_y - 1])
|
||||||
[(y + 1 + space_y) % space_y, (y - 1 + space_y) % space_y]
|
[(y + 1 + space_y) % space_y, (y - 1 + space_y) % space_y]
|
||||||
@@ -72,19 +63,16 @@ function reaction_diffusion(
|
|||||||
for(x = [0:space_x - 1])
|
for(x = [0:space_x - 1])
|
||||||
[(x + 1 + space_x) % space_x, (x - 1 + space_x) % space_x]
|
[(x + 1 + space_x) % space_x, (x - 1 + space_x) % space_x]
|
||||||
],
|
],
|
||||||
nuv = _reaction_diffusion(feel, kill, generation, uv, Du, Dv, uy_ly, rx_lx, space_x, space_y)
|
nuv = _reaction_diffusion(feed, kill, generation, uv, Du, Dv, uy_ly, rx_lx, space_x, space_y)
|
||||||
)
|
)
|
||||||
[
|
nuv;
|
||||||
[for(row = nuv) [for(uv = row) uv[0]]],
|
|
||||||
[for(row = nuv) [for(uv = row) uv[1]]]
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
use <surface/sf_thicken.scad>;
|
use <surface/sf_thicken.scad>;
|
||||||
use <experimental/reaction_diffusion.scad>;
|
use <experimental/reaction_diffusion.scad>;
|
||||||
|
|
||||||
feel = 0.04;
|
feed = 0.04;
|
||||||
kill = 0.06;
|
kill = 0.06;
|
||||||
generation = 1000;
|
generation = 1000;
|
||||||
thickness = 0.5;
|
thickness = 0.5;
|
||||||
@@ -92,16 +80,16 @@ altitude_scale = 10;
|
|||||||
space_size = [50, 50];
|
space_size = [50, 50];
|
||||||
init_size = [10, 10];
|
init_size = [10, 10];
|
||||||
|
|
||||||
uv = reaction_diffusion(feel, kill, generation, space_size, init_size);
|
uv = reaction_diffusion(feed, kill, generation, space_size, init_size);
|
||||||
|
|
||||||
leng_y = len(uv[0]);
|
leng_y = len(uv);
|
||||||
leng_x = len(uv[0][0]);
|
leng_x = len(uv[0]);
|
||||||
|
|
||||||
points = [
|
points = [
|
||||||
for(y = [0:leng_y - 1])
|
for(y = [0:leng_y - 1])
|
||||||
[
|
[
|
||||||
for(x = [0:leng_x - 1])
|
for(x = [0:leng_x - 1])
|
||||||
[x, y, uv[0][y][x] * altitude_scale]
|
[x, y, uv[y][x][0] * altitude_scale]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user