mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-06 06:47:46 +02:00
optimization
This commit is contained in:
@@ -11,55 +11,52 @@ function updated(x, y, dots) =
|
||||
else dots[r]
|
||||
];
|
||||
|
||||
function _mz_hamiltonian_top(x, y) =
|
||||
let(
|
||||
nx = x * 2,
|
||||
ny = y * 2
|
||||
)
|
||||
[[nx, ny + 2], [nx + 1, ny + 2], [nx + 2, ny + 2]];
|
||||
function _top(x, y) =
|
||||
let(nx = x * 2, ny_2 = y * 2 + 2)
|
||||
[for(i = [0:2]) [nx + i, ny_2]];
|
||||
|
||||
function _mz_hamiltonian_right(x, y) =
|
||||
let(
|
||||
nx = x * 2,
|
||||
ny = y * 2
|
||||
)
|
||||
[[nx + 2, ny + 2], [nx + 2, ny + 1], [nx + 2, ny]];
|
||||
function _right(x, y) =
|
||||
let(nx_2 = x * 2 + 2, ny = y * 2)
|
||||
[for(i = [2, 1, 0]) [nx_2, ny + i]];
|
||||
|
||||
function _mz_hamiltonian_top_right(x, y) =
|
||||
function _top_right(x, y) =
|
||||
let(
|
||||
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(
|
||||
c1 = dotM[y][x] ? 1 : 0,
|
||||
c2 = dotM[y + 1][x] ? 2 : 0,
|
||||
c3 = dotM[y + 1][x + 1] ? 4 : 0,
|
||||
c4 = dotM[y][x + 1] ? 8 : 0
|
||||
dotMy = dotM[y],
|
||||
dotMy1 = dotM[y + 1],
|
||||
x_1 = x + 1,
|
||||
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;
|
||||
|
||||
_mz_hamiltonian_dir_table = [
|
||||
_dir_table = [
|
||||
[4, 0], [12, 0], [13, 0], // UP
|
||||
[1, 1], [3, 1], [7, 1], // DOWN
|
||||
[2, 2], [6, 2], [14, 2], // LEFT
|
||||
[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], // DOWN
|
||||
[-1, 0], // LEFT
|
||||
[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(
|
||||
end = leng - 1,
|
||||
pts = [
|
||||
|
@@ -32,9 +32,9 @@ function mz_hamiltonian(rows, columns, start = [0, 0], init_cells, seed) =
|
||||
[
|
||||
for(row = cells, cell = row)
|
||||
let(type = mz_square_get(cell, "t"))
|
||||
each if(type == "TOP_WALL") _mz_hamiltonian_top(cell.x, cell.y) else
|
||||
if(type == "RIGHT_WALL") _mz_hamiltonian_right(cell.x, cell.y) else
|
||||
if(type == "TOP_RIGHT_WALL" || type == "MASK") _mz_hamiltonian_top_right(cell.x, cell.y)
|
||||
each if(type == "TOP_WALL") _top(cell.x, cell.y) else
|
||||
if(type == "RIGHT_WALL") _right(cell.x, cell.y) else
|
||||
if(type == "TOP_RIGHT_WALL" || type == "MASK") _top_right(cell.x, cell.y)
|
||||
],
|
||||
[for(x = [0:c * 2 - 1]) [x, 0]],
|
||||
[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 :
|
||||
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