1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-11 01:04:07 +02:00

performance improved

This commit is contained in:
Justin Lin
2021-04-17 22:00:24 +08:00
parent 5b76beed2f
commit 49f66cded2

View File

@@ -2,8 +2,9 @@ use <_tri_delaunay_comm_impl.scad>;
use <experimental/tri_circumcircle.scad>;
use <util/map/hashmap.scad>;
use <util/map/hashmap_get.scad>;
use <util/map/hashmap_del.scad>;
use <util/map/hashmap_keys.scad>;
use <util/map/hashmap_entries.scad>;
use <util/map/hashmap_put.scad>;
use <util/some.scad>;
use <util/has.scad>;
use <util/slice.scad>;
@@ -67,14 +68,23 @@ function adjustNeighbors(d, newTriangles) =
],
nd = [
coords,
hashmap(concat(hashmap_entries(delaunay_triangles(d)), nts)),
hashmap(concat(hashmap_entries(delaunay_circles(d)), ncs))
hashmap_puts(delaunay_triangles(d), nts),
hashmap_puts(delaunay_circles(d), ncs),
],
leng = len(newTriangles),
aDtrid = _adjustNeighborsDtri(nd, newTriangles, leng)
)
_adjustNeighborsOtri(aDtrid, newTriangles, leng);
function hashmap_puts(m, kv_lt) =
let(leng = len(kv_lt))
_hashmap_puts(m, kv_lt, leng);
function _hashmap_puts(m, kv_lt, leng, i = 0) =
i == leng ? m :
let(kv = kv_lt[i])
_hashmap_puts(hashmap_put(m, kv[0], kv[1]), kv_lt, leng, i + 1);
function _adjustNeighborsOtri(d, newTriangles, leng, i = 0) =
i == leng ? d :
let(
@@ -82,8 +92,8 @@ function _adjustNeighborsOtri(d, newTriangles, leng, i = 0) =
nbr1 = newTriangles[(i + 1) % leng][0],
nbr2 = newTriangles[i > 0 ? i - 1 : leng + i - 1][0],
triangles = delaunay_triangles(d),
entries = hashmap_entries(triangles),
nTriangles = hashmap([for(entry = entries) entry[0] == t ? [t, [entry[1][0], nbr1, nbr2]] : entry]),
v = hashmap_get(triangles, t),
nTriangles = hashmap_put(hashmap_del(triangles, t), t, [v[0], nbr1, nbr2]),
nd = [delaunay_coords(d), nTriangles, delaunay_circles(d)]
)
_adjustNeighborsOtri(nd, newTriangles, leng, i + 1);
@@ -109,11 +119,7 @@ function updateNbrs(d, delaunayTri, neighbors) =
coords = delaunay_coords(d),
triangles = delaunay_triangles(d),
circles = delaunay_circles(d),
tri_entries = hashmap_entries(triangles),
nTriangles = hashmap([
for(entry = tri_entries)
entry[0] == delaunayTri ? [delaunayTri, neighbors] : entry
])
nTriangles = hashmap_put(hashmap_del(triangles, delaunayTri), delaunayTri, neighbors)
)
[coords, nTriangles, circles];