mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-13 18:24:28 +02:00
refactor: use sorted
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
use <../util/slice.scad>;
|
use <../util/slice.scad>;
|
||||||
use <../util/sort.scad>;
|
use <../util/sorted.scad>;
|
||||||
|
|
||||||
// oa->ob ct_clk : greater than 0
|
// oa->ob ct_clk : greater than 0
|
||||||
function _convex_hull_impl_dir(o, a, b) = cross(a - o, b - o);
|
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) =
|
function _convex_hull2(points) =
|
||||||
let(
|
let(
|
||||||
sorted = sort(points, by = function(p1, p2) p1 < p2 ? -1 : 1),
|
sorted_pts = sorted(points),
|
||||||
leng = len(sorted),
|
leng = len(sorted_pts),
|
||||||
lwr_ch = _convex_hull_lower_chain(sorted, leng, [], 0, 0),
|
lwr_ch = _convex_hull_lower_chain(sorted_pts, leng, [], 0, 0),
|
||||||
leng_lwr_ch = len(lwr_ch),
|
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]];
|
[for(i = [0:len(chain) - 2]) chain[i]];
|
@@ -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]]);
|
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) =
|
function _convex_hull3(pts) =
|
||||||
let(
|
let(
|
||||||
sorted = sort(pts, by = function(p1, p2) p1 < p2 ? -1 : 1),
|
sorted_pts = sorted(pts),
|
||||||
leng = len(sorted),
|
leng = len(sorted_pts),
|
||||||
v0 = 0,
|
v0 = 0,
|
||||||
v1 = _fst_v1(sorted, leng, v0 + 1),
|
v1 = _fst_v1(sorted_pts, leng, v0 + 1),
|
||||||
v2 = assert(v1 < leng, "common points")
|
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")
|
n = assert(v2 < leng, "collinear points")
|
||||||
cross(sorted[v1] - sorted[v0], sorted[v2] - sorted[v0]),
|
cross(sorted_pts[v1] - sorted_pts[v0], sorted_pts[v2] - sorted_pts[v0]),
|
||||||
v3_d = _fst_v3(sorted, leng, n, 0, v2 + 1),
|
v3_d = _fst_v3(sorted_pts, leng, n, 0, v2 + 1),
|
||||||
v3 = v3_d[0],
|
v3 = v3_d[0],
|
||||||
d = assert(v3 < leng, "coplanar points")
|
d = assert(v3 < leng, "coplanar points")
|
||||||
v3_d[1],
|
v3_d[1],
|
||||||
@@ -96,13 +96,13 @@ function _convex_hull3(pts) =
|
|||||||
],
|
],
|
||||||
zeros = [for(j = [0:leng - 1]) 0],
|
zeros = [for(j = [0:leng - 1]) 0],
|
||||||
init_vis = [for(i = [0:leng - 1]) zeros],
|
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 = [
|
reversed = [
|
||||||
for(face = faces) // OpenSCAD requires clockwise.
|
for(face = faces) // OpenSCAD requires clockwise.
|
||||||
[face[2], face[1], face[0]]
|
[face[2], face[1], face[0]]
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
[
|
[
|
||||||
sorted,
|
sorted_pts,
|
||||||
reversed
|
reversed
|
||||||
];
|
];
|
@@ -11,7 +11,7 @@
|
|||||||
use <../__comm__/_pt2_hash.scad>;
|
use <../__comm__/_pt2_hash.scad>;
|
||||||
use <_impl/_mz_wang_tiles_impl.scad>;
|
use <_impl/_mz_wang_tiles_impl.scad>;
|
||||||
use <mz_square_get.scad>;
|
use <mz_square_get.scad>;
|
||||||
use <../util/sort.scad>;
|
use <../util/sorted.scad>;
|
||||||
use <../util/set/hashset.scad>;
|
use <../util/set/hashset.scad>;
|
||||||
use <../util/set/hashset_elems.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]
|
[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])
|
for(y = [0:rows - 1], x = [0:columns - 1])
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
use <../../util/sort.scad>;
|
use <../../util/sorted.scad>;
|
||||||
use <../../util/sum.scad>;
|
use <../../util/sum.scad>;
|
||||||
|
|
||||||
function _manhattan(v) = sum([for(d = v) abs(d)]);
|
function _manhattan(v) = sum([for(d = v) abs(d)]);
|
||||||
@@ -23,9 +23,9 @@ function _nz_cell_border(cells, p) =
|
|||||||
[each cell, norm(cell - p)]
|
[each cell, norm(cell - p)]
|
||||||
],
|
],
|
||||||
idx = len(cells[0]),
|
idx = len(cells[0]),
|
||||||
sorted = sort(dists, by = "idx", idx = idx),
|
sorted_dists = sorted(dists, cmp = function(a, b) a[idx] - b[idx]),
|
||||||
sorted0 = sorted[0],
|
sorted0 = sorted_dists[0],
|
||||||
sorted1 = sorted[1],
|
sorted1 = sorted_dists[1],
|
||||||
a = [for(i = [0:idx - 1]) sorted0[i]],
|
a = [for(i = [0:idx - 1]) sorted0[i]],
|
||||||
m = (a + [for(i = [0:idx - 1]) sorted1[i]]) / 2
|
m = (a + [for(i = [0:idx - 1]) sorted1[i]]) / 2
|
||||||
)
|
)
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
use <_nz_worley_comm.scad>;
|
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) =
|
function _neighbors(fcord, seed, grid_w) =
|
||||||
let(range = [-1:1])
|
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)]] :
|
cells = dist == "euclidean" ? [for(nbr = nbrs) [each nbr, norm(nbr - p)]] :
|
||||||
dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] :
|
dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] :
|
||||||
dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] :
|
dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] :
|
||||||
assert("Unknown distance option"),
|
assert("Unknown distance option")
|
||||||
sorted = sort(cells, by = "idx", idx = 2)
|
|
||||||
)
|
)
|
||||||
sorted[0];
|
sorted(cells, _cmp)[0];
|
||||||
|
|
||||||
function _nz_worley2_border(p, nbrs) =
|
function _nz_worley2_border(p, nbrs) =
|
||||||
let(
|
let(
|
||||||
@@ -32,9 +33,9 @@ function _nz_worley2_border(p, nbrs) =
|
|||||||
for(nbr = nbrs)
|
for(nbr = nbrs)
|
||||||
[each nbr, norm(nbr - p)]
|
[each nbr, norm(nbr - p)]
|
||||||
],
|
],
|
||||||
sorted = sort(cells, by = "z"),
|
sorted_cells = sorted(cells, _cmp),
|
||||||
a = [sorted[0].x, sorted[0].y],
|
a = [sorted_cells[0].x, sorted_cells[0].y],
|
||||||
m = (a + [sorted[1].x, sorted[1].y]) / 2
|
m = (a + [sorted_cells[1].x, sorted_cells[1].y]) / 2
|
||||||
)
|
)
|
||||||
[a[0], a[1], (p - m) * (a - m)];
|
[a[0], a[1], (p - m) * (a - m)];
|
||||||
|
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
use <_nz_worley_comm.scad>;
|
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) =
|
function _neighbors(fcord, seed, grid_w) =
|
||||||
let(range = [-1:1])
|
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)]] :
|
cells = dist == "euclidean" ? [for(nbr = nbrs) [each nbr, norm(nbr - p)]] :
|
||||||
dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] :
|
dist == "manhattan" ? [for(nbr = nbrs) [each nbr, _manhattan(nbr - p)]] :
|
||||||
dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] :
|
dist == "chebyshev" ? [for(nbr = nbrs) [each nbr, _chebyshev(nbr, p)]] :
|
||||||
assert("Unknown distance option"),
|
assert("Unknown distance option")
|
||||||
sorted = sort(cells, by = "idx", idx = 3)
|
|
||||||
)
|
)
|
||||||
sorted[0];
|
sorted(cells, _cmp)[0];
|
||||||
|
|
||||||
function _nz_worley3_border(p, nbrs) =
|
function _nz_worley3_border(p, nbrs) =
|
||||||
let(
|
let(
|
||||||
@@ -34,9 +35,9 @@ function _nz_worley3_border(p, nbrs) =
|
|||||||
for(nbr = nbrs)
|
for(nbr = nbrs)
|
||||||
[each nbr, norm(nbr - p)]
|
[each nbr, norm(nbr - p)]
|
||||||
],
|
],
|
||||||
sorted = sort(cells, by = "idx", idx = 3),
|
sorted_cells = sorted(cells, _cmp),
|
||||||
a = [sorted[0].x, sorted[0].y, sorted[0].z],
|
a = [sorted_cells[0].x, sorted_cells[0].y, sorted_cells[0].z],
|
||||||
m = (a + [sorted[1].x, sorted[1].y, sorted[1].z]) / 2
|
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)];
|
[a[0], a[1], a[2], (p - m) * (a - m)];
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
use <../__comm__/_face_normal.scad>;
|
use <../__comm__/_face_normal.scad>;
|
||||||
use <../util/sort.scad>;
|
use <../util/sorted.scad>;
|
||||||
use <../util/sum.scad>;
|
use <../util/sum.scad>;
|
||||||
use <../surface/sf_solidifyT.scad>;
|
use <../surface/sf_solidifyT.scad>;
|
||||||
use <../triangle/tri_delaunay.scad>;
|
use <../triangle/tri_delaunay.scad>;
|
||||||
@@ -43,7 +43,7 @@ module sf_thickenT(points, thickness, triangles = undef, direction = "BOTH", con
|
|||||||
|
|
||||||
if(is_list(direction)) {
|
if(is_list(direction)) {
|
||||||
dir_v = direction / norm(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];
|
tri = cnn_tris[search([mid], points)[0]][0];
|
||||||
nv = _face_normal([points[tri[0]], points[tri[1]], points[tri[2]]]);
|
nv = _face_normal([points[tri[0]], points[tri[1]], points[tri[2]]]);
|
||||||
off = dir_v * thickness;
|
off = dir_v * thickness;
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
use <../../util/sort.scad>;
|
use <../../util/sorted.scad>;
|
||||||
use <_convex_centroid.scad>;
|
use <_convex_centroid.scad>;
|
||||||
|
|
||||||
function _convex_ct_clk_order(points) =
|
function _convex_ct_clk_order(points) =
|
||||||
let(cpt = _convex_centroid(points))
|
let(cpt = _convex_centroid(points))
|
||||||
sort(points, by = function(p1, p2) cross(p2 - cpt, p1 - cpt));
|
sorted(points, cmp = function(p1, p2) cross(p2 - cpt, p1 - cpt));
|
Reference in New Issue
Block a user