mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-06 23:06:43 +02:00
optimization
This commit is contained in:
@@ -11,55 +11,52 @@ function updated(x, y, dots) =
|
|||||||
else dots[r]
|
else dots[r]
|
||||||
];
|
];
|
||||||
|
|
||||||
function _mz_hamiltonian_top(x, y) =
|
function _top(x, y) =
|
||||||
let(
|
let(nx = x * 2, ny_2 = y * 2 + 2)
|
||||||
nx = x * 2,
|
[for(i = [0:2]) [nx + i, ny_2]];
|
||||||
ny = y * 2
|
|
||||||
)
|
|
||||||
[[nx, ny + 2], [nx + 1, ny + 2], [nx + 2, ny + 2]];
|
|
||||||
|
|
||||||
function _mz_hamiltonian_right(x, y) =
|
function _right(x, y) =
|
||||||
let(
|
let(nx_2 = x * 2 + 2, ny = y * 2)
|
||||||
nx = x * 2,
|
[for(i = [2, 1, 0]) [nx_2, ny + i]];
|
||||||
ny = y * 2
|
|
||||||
)
|
|
||||||
[[nx + 2, ny + 2], [nx + 2, ny + 1], [nx + 2, ny]];
|
|
||||||
|
|
||||||
function _mz_hamiltonian_top_right(x, y) =
|
function _top_right(x, y) =
|
||||||
let(
|
let(
|
||||||
nx = x * 2,
|
nx = x * 2,
|
||||||
ny = y * 2
|
ny = y * 2,
|
||||||
|
nx_2 = nx + 2,
|
||||||
|
ny_2 = ny + 2
|
||||||
)
|
)
|
||||||
[[nx, ny + 2], [nx + 1, ny + 2], [nx + 2, ny + 2], [nx + 2, ny + 1], [nx + 2, ny]];
|
[[nx, ny_2], [nx + 1, ny_2], [nx_2, ny_2], [nx_2, ny + 1], [nx_2, ny]];
|
||||||
|
|
||||||
function _mz_hamiltonian_corner_value(dotM, x, y) =
|
function _corner_value(dotM, x, y) =
|
||||||
let(
|
let(
|
||||||
c1 = dotM[y][x] ? 1 : 0,
|
dotMy = dotM[y],
|
||||||
c2 = dotM[y + 1][x] ? 2 : 0,
|
dotMy1 = dotM[y + 1],
|
||||||
c3 = dotM[y + 1][x + 1] ? 4 : 0,
|
x_1 = x + 1,
|
||||||
c4 = dotM[y][x + 1] ? 8 : 0
|
c1 = dotMy[x] ? 1 : 0,
|
||||||
|
c2 = dotMy1[x] ? 2 : 0,
|
||||||
|
c3 = dotMy1[x_1] ? 4 : 0,
|
||||||
|
c4 = dotMy[x_1] ? 8 : 0
|
||||||
)
|
)
|
||||||
c1 + c2 + c3 + c4;
|
c1 + c2 + c3 + c4;
|
||||||
|
|
||||||
_mz_hamiltonian_dir_table = [
|
_dir_table = [
|
||||||
[4, 0], [12, 0], [13, 0], // UP
|
[4, 0], [12, 0], [13, 0], // UP
|
||||||
[1, 1], [3, 1], [7, 1], // DOWN
|
[1, 1], [3, 1], [7, 1], // DOWN
|
||||||
[2, 2], [6, 2], [14, 2], // LEFT
|
[2, 2], [6, 2], [14, 2], // LEFT
|
||||||
[8, 3], [9, 3], [11, 3] // RIGHT
|
[8, 3], [9, 3], [11, 3] // RIGHT
|
||||||
];
|
];
|
||||||
function _mz_hamiltonian_dir(cr_value) =
|
|
||||||
lookup(cr_value, _mz_hamiltonian_dir_table);
|
|
||||||
|
|
||||||
_mz_hamiltonian_nxt_offset = [
|
_nxt_offset = [
|
||||||
[0, 1], // UP
|
[0, 1], // UP
|
||||||
[0, -1], // DOWN
|
[0, -1], // DOWN
|
||||||
[-1, 0], // LEFT
|
[-1, 0], // LEFT
|
||||||
[1, 0] // RIGHT
|
[1, 0] // RIGHT
|
||||||
];
|
];
|
||||||
|
|
||||||
function nxtp(dotM, p) = p + _mz_hamiltonian_nxt_offset[_mz_hamiltonian_dir(_mz_hamiltonian_corner_value(dotM, p.x, p.y))];
|
function nxtp(dotM, p) = p + _nxt_offset[lookup(_corner_value(dotM, p.x, p.y), _dir_table)];
|
||||||
|
|
||||||
function _mz_hamiltonian_travel(dotM, p, leng) =
|
function _travel(dotM, p, leng) =
|
||||||
let(
|
let(
|
||||||
end = leng - 1,
|
end = leng - 1,
|
||||||
pts = [
|
pts = [
|
||||||
|
@@ -32,9 +32,9 @@ function mz_hamiltonian(rows, columns, start = [0, 0], init_cells, seed) =
|
|||||||
[
|
[
|
||||||
for(row = cells, cell = row)
|
for(row = cells, cell = row)
|
||||||
let(type = mz_square_get(cell, "t"))
|
let(type = mz_square_get(cell, "t"))
|
||||||
each if(type == "TOP_WALL") _mz_hamiltonian_top(cell.x, cell.y) else
|
each if(type == "TOP_WALL") _top(cell.x, cell.y) else
|
||||||
if(type == "RIGHT_WALL") _mz_hamiltonian_right(cell.x, cell.y) else
|
if(type == "RIGHT_WALL") _right(cell.x, cell.y) else
|
||||||
if(type == "TOP_RIGHT_WALL" || type == "MASK") _mz_hamiltonian_top_right(cell.x, cell.y)
|
if(type == "TOP_RIGHT_WALL" || type == "MASK") _top_right(cell.x, cell.y)
|
||||||
],
|
],
|
||||||
[for(x = [0:c * 2 - 1]) [x, 0]],
|
[for(x = [0:c * 2 - 1]) [x, 0]],
|
||||||
[for(y = [0:r * 2 - 1]) [0, y]]
|
[for(y = [0:r * 2 - 1]) [0, y]]
|
||||||
@@ -53,4 +53,4 @@ function mz_hamiltonian(rows, columns, start = [0, 0], init_cells, seed) =
|
|||||||
path_leng = init_cells_undef ? r * c :
|
path_leng = init_cells_undef ? r * c :
|
||||||
len([for(row = init_cells, cell = row) if(mz_square_get(cell, "t") != "MASK") undef])
|
len([for(row = init_cells, cell = row) if(mz_square_get(cell, "t") != "MASK") undef])
|
||||||
)
|
)
|
||||||
_mz_hamiltonian_travel(dotM, start * 2, path_leng * 4);
|
_travel(dotM, start * 2, path_leng * 4);
|
Reference in New Issue
Block a user