From ed4d8efb55ca793aff7c2a19f4d221f723c5bbc7 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 15 Apr 2022 09:21:36 +0800 Subject: [PATCH] refactor: use sorted --- src/__comm__/_convex_hull2.scad | 10 +++++----- src/__comm__/_convex_hull3.scad | 18 +++++++++--------- src/maze/mz_wang_tiles.scad | 7 +++++-- src/noise/_impl/_nz_cell_impl.scad | 8 ++++---- src/noise/_impl/_nz_worley2_impl.scad | 15 ++++++++------- src/noise/_impl/_nz_worley3_impl.scad | 15 ++++++++------- src/surface/sf_thickenT.scad | 4 ++-- src/voronoi/_impl/_convex_ct_clk_order.scad | 4 ++-- 8 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/__comm__/_convex_hull2.scad b/src/__comm__/_convex_hull2.scad index 0e06d5d4..290608fc 100644 --- a/src/__comm__/_convex_hull2.scad +++ b/src/__comm__/_convex_hull2.scad @@ -1,5 +1,5 @@ use <../util/slice.scad>; -use <../util/sort.scad>; +use <../util/sorted.scad>; // oa->ob ct_clk : greater than 0 function _convex_hull_impl_dir(o, a, b) = cross(a - o, b - o); @@ -34,10 +34,10 @@ function _convex_hull_upper_chain(points, chain, m, t, i) = function _convex_hull2(points) = let( - sorted = sort(points, by = function(p1, p2) p1 < p2 ? -1 : 1), - leng = len(sorted), - lwr_ch = _convex_hull_lower_chain(sorted, leng, [], 0, 0), + sorted_pts = sorted(points), + leng = len(sorted_pts), + lwr_ch = _convex_hull_lower_chain(sorted_pts, leng, [], 0, 0), leng_lwr_ch = len(lwr_ch), - chain = _convex_hull_upper_chain(sorted, lwr_ch, leng_lwr_ch, leng_lwr_ch + 1, leng - 2) + chain = _convex_hull_upper_chain(sorted_pts, lwr_ch, leng_lwr_ch, leng_lwr_ch + 1, leng - 2) ) [for(i = [0:len(chain) - 2]) chain[i]]; \ No newline at end of file diff --git a/src/__comm__/_convex_hull3.scad b/src/__comm__/_convex_hull3.scad index 8bb35c55..7dc46e74 100644 --- a/src/__comm__/_convex_hull3.scad +++ b/src/__comm__/_convex_hull3.scad @@ -1,4 +1,4 @@ -use <../util/sort.scad>; +use <../util/sorted.scad>; function normal(pts, f) = cross(pts[f[1]] - pts[f[0]], pts[f[2]] - pts[f[0]]); @@ -69,15 +69,15 @@ function _all_faces(v0, v1, v2, v3, pts, pts_leng, vis, cur_faces, i = 0) = function _convex_hull3(pts) = let( - sorted = sort(pts, by = function(p1, p2) p1 < p2 ? -1 : 1), - leng = len(sorted), + sorted_pts = sorted(pts), + leng = len(sorted_pts), v0 = 0, - v1 = _fst_v1(sorted, leng, v0 + 1), + v1 = _fst_v1(sorted_pts, leng, v0 + 1), v2 = assert(v1 < leng, "common points") - _fst_v2(sorted, leng, v1, v1 + 1), + _fst_v2(sorted_pts, leng, v1, v1 + 1), n = assert(v2 < leng, "collinear points") - cross(sorted[v1] - sorted[v0], sorted[v2] - sorted[v0]), - v3_d = _fst_v3(sorted, leng, n, 0, v2 + 1), + cross(sorted_pts[v1] - sorted_pts[v0], sorted_pts[v2] - sorted_pts[v0]), + v3_d = _fst_v3(sorted_pts, leng, n, 0, v2 + 1), v3 = v3_d[0], d = assert(v3 < leng, "coplanar points") v3_d[1], @@ -96,13 +96,13 @@ function _convex_hull3(pts) = ], zeros = [for(j = [0:leng - 1]) 0], init_vis = [for(i = [0:leng - 1]) zeros], - faces = _all_faces(v0, v1, v2, v3, sorted, leng, init_vis, fst_tetrahedron), // counter-clockwise + faces = _all_faces(v0, v1, v2, v3, sorted_pts, leng, init_vis, fst_tetrahedron), // counter-clockwise reversed = [ for(face = faces) // OpenSCAD requires clockwise. [face[2], face[1], face[0]] ] ) [ - sorted, + sorted_pts, reversed ]; \ No newline at end of file diff --git a/src/maze/mz_wang_tiles.scad b/src/maze/mz_wang_tiles.scad index fa844382..afb7f4de 100644 --- a/src/maze/mz_wang_tiles.scad +++ b/src/maze/mz_wang_tiles.scad @@ -11,7 +11,7 @@ use <../__comm__/_pt2_hash.scad>; use <_impl/_mz_wang_tiles_impl.scad>; use ; -use <../util/sort.scad>; +use <../util/sorted.scad>; use <../util/set/hashset.scad>; use <../util/set/hashset_elems.scad>; @@ -45,7 +45,10 @@ function mz_wang_tiles(cells, left_border = true, bottom_border = true) = [type == "TOP_WALL" || type == "NO_WALL" ? 1 : 0, y * 2 + 1] ] ), - dot_pts = sort(hashset_elems(hashset(all, hash = function(p) _pt2_hash(p))), by = "vt") + dot_pts = sorted( + hashset_elems(hashset(all, hash = function(p) _pt2_hash(p))), + function(a, b) let(d = a - b) d.y == 0 ? d.x : d.y + ) ) [ for(y = [0:rows - 1], x = [0:columns - 1]) diff --git a/src/noise/_impl/_nz_cell_impl.scad b/src/noise/_impl/_nz_cell_impl.scad index ec7e0846..f9bec4f4 100644 --- a/src/noise/_impl/_nz_cell_impl.scad +++ b/src/noise/_impl/_nz_cell_impl.scad @@ -1,4 +1,4 @@ -use <../../util/sort.scad>; +use <../../util/sorted.scad>; use <../../util/sum.scad>; function _manhattan(v) = sum([for(d = v) abs(d)]); @@ -23,9 +23,9 @@ function _nz_cell_border(cells, p) = [each cell, norm(cell - p)] ], idx = len(cells[0]), - sorted = sort(dists, by = "idx", idx = idx), - sorted0 = sorted[0], - sorted1 = sorted[1], + sorted_dists = sorted(dists, cmp = function(a, b) a[idx] - b[idx]), + sorted0 = sorted_dists[0], + sorted1 = sorted_dists[1], a = [for(i = [0:idx - 1]) sorted0[i]], m = (a + [for(i = [0:idx - 1]) sorted1[i]]) / 2 ) diff --git a/src/noise/_impl/_nz_worley2_impl.scad b/src/noise/_impl/_nz_worley2_impl.scad index 9da4d3d6..27e32a09 100644 --- a/src/noise/_impl/_nz_worley2_impl.scad +++ b/src/noise/_impl/_nz_worley2_impl.scad @@ -1,5 +1,7 @@ use <_nz_worley_comm.scad>; -use <../../util/sort.scad>; +use <../../util/sorted.scad>; + +_cmp = function(a, b) a[2] - b[2]; function _neighbors(fcord, seed, grid_w) = let(range = [-1:1]) @@ -21,10 +23,9 @@ function _nz_worley2_classic(p, nbrs, dist) = cells = dist == "euclidean" ? [for(nbr = nbrs) [each nbr, norm(nbr - p)]] : dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] : dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] : - assert("Unknown distance option"), - sorted = sort(cells, by = "idx", idx = 2) + assert("Unknown distance option") ) - sorted[0]; + sorted(cells, _cmp)[0]; function _nz_worley2_border(p, nbrs) = let( @@ -32,9 +33,9 @@ function _nz_worley2_border(p, nbrs) = for(nbr = nbrs) [each nbr, norm(nbr - p)] ], - sorted = sort(cells, by = "z"), - a = [sorted[0].x, sorted[0].y], - m = (a + [sorted[1].x, sorted[1].y]) / 2 + sorted_cells = sorted(cells, _cmp), + a = [sorted_cells[0].x, sorted_cells[0].y], + m = (a + [sorted_cells[1].x, sorted_cells[1].y]) / 2 ) [a[0], a[1], (p - m) * (a - m)]; diff --git a/src/noise/_impl/_nz_worley3_impl.scad b/src/noise/_impl/_nz_worley3_impl.scad index f4b0b781..548b9257 100644 --- a/src/noise/_impl/_nz_worley3_impl.scad +++ b/src/noise/_impl/_nz_worley3_impl.scad @@ -1,5 +1,7 @@ use <_nz_worley_comm.scad>; -use <../../util/sort.scad>; +use <../../util/sorted.scad>; + +_cmp = function(a, b) a[3] - b[3]; function _neighbors(fcord, seed, grid_w) = let(range = [-1:1]) @@ -23,10 +25,9 @@ function _nz_worley3_classic(p, nbrs, dist) = cells = dist == "euclidean" ? [for(nbr = nbrs) [each nbr, norm(nbr - p)]] : dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] : dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] : - assert("Unknown distance option"), - sorted = sort(cells, by = "idx", idx = 3) + assert("Unknown distance option") ) - sorted[0]; + sorted(cells, _cmp)[0]; function _nz_worley3_border(p, nbrs) = let( @@ -34,9 +35,9 @@ function _nz_worley3_border(p, nbrs) = for(nbr = nbrs) [each nbr, norm(nbr - p)] ], - sorted = sort(cells, by = "idx", idx = 3), - a = [sorted[0].x, sorted[0].y, sorted[0].z], - m = (a + [sorted[1].x, sorted[1].y, sorted[1].z]) / 2 + sorted_cells = sorted(cells, _cmp), + a = [sorted_cells[0].x, sorted_cells[0].y, sorted_cells[0].z], + m = (a + [sorted_cells[1].x, sorted_cells[1].y, sorted_cells[1].z]) / 2 ) [a[0], a[1], a[2], (p - m) * (a - m)]; diff --git a/src/surface/sf_thickenT.scad b/src/surface/sf_thickenT.scad index 5c3e4c9e..69cc94f4 100644 --- a/src/surface/sf_thickenT.scad +++ b/src/surface/sf_thickenT.scad @@ -9,7 +9,7 @@ **/ use <../__comm__/_face_normal.scad>; -use <../util/sort.scad>; +use <../util/sorted.scad>; use <../util/sum.scad>; use <../surface/sf_solidifyT.scad>; use <../triangle/tri_delaunay.scad>; @@ -43,7 +43,7 @@ module sf_thickenT(points, thickness, triangles = undef, direction = "BOTH", con if(is_list(direction)) { dir_v = direction / norm(direction); - mid = sort(points)[leng_pts / 2]; + mid = sorted(points)[leng_pts / 2]; tri = cnn_tris[search([mid], points)[0]][0]; nv = _face_normal([points[tri[0]], points[tri[1]], points[tri[2]]]); off = dir_v * thickness; diff --git a/src/voronoi/_impl/_convex_ct_clk_order.scad b/src/voronoi/_impl/_convex_ct_clk_order.scad index 14540ff9..b8a0a8ef 100644 --- a/src/voronoi/_impl/_convex_ct_clk_order.scad +++ b/src/voronoi/_impl/_convex_ct_clk_order.scad @@ -1,6 +1,6 @@ -use <../../util/sort.scad>; +use <../../util/sorted.scad>; use <_convex_centroid.scad>; function _convex_ct_clk_order(points) = let(cpt = _convex_centroid(points)) - sort(points, by = function(p1, p2) cross(p2 - cpt, p1 - cpt)); \ No newline at end of file + sorted(points, cmp = function(p1, p2) cross(p2 - cpt, p1 - cpt)); \ No newline at end of file