diff --git a/src/experimental/_impl/_nz_cells_impl.scad b/src/experimental/_impl/_nz_cells_impl.scad new file mode 100644 index 00000000..aed978b6 --- /dev/null +++ b/src/experimental/_impl/_nz_cells_impl.scad @@ -0,0 +1,33 @@ +use ; +use ; + +function _manhattan(v) = sum([for(d = v) abs(d)]); + +function _chebyshev(p1, p2) = + max([for(i = [0:len(p1) - 1]) abs(p1[i] - p2[i])]); + +function _nz_cells_classic(cells, p, dist) = + let( + dists = [ + for(i = [0:len(cells) - 1]) + dist == "euclidean" ? norm(cells[i] - p) : + dist == "manhattan" ? _manhattan(cells[i] - p) : + dist == "chebyshev" ? _chebyshev(cells[i], p) : + assert("Unknown distance option") + ] + ) + min(dists); + +function _nz_cells_border(cells, p) = + let( + dists = [ + for(i = [0:len(cells) - 1]) + concat(cells[i], [norm(cells[i] - p)]) + ], + idx = len(cells[0]), + sorted = sort(dists, by = "idx", idx = idx), + a = [for(i = [0:idx - 1]) sorted[0][i]], + b = [for(i = [0:idx - 1]) sorted[1][i]], + m = (a + b) / 2 + ) + (p - m) * (a - m); \ No newline at end of file diff --git a/src/experimental/demo/nz_cells_demo.scad b/src/experimental/demo/nz_cells_demo.scad new file mode 100644 index 00000000..87f72b64 --- /dev/null +++ b/src/experimental/demo/nz_cells_demo.scad @@ -0,0 +1,28 @@ +use ; +use ; + +size = [100, 50]; +half_size = size / 2; + +pts_angles = golden_spiral( + from = 3, + to = 10, + point_distance = 3 +); + +cells = [for(pt_angle = pts_angles) pt_angle[0] + half_size]; +noised = [ + for(y = [0:size[1] - 1]) + for(x = [0:size[0] - 1]) + [x, y, nz_cells(cells, [x, y])] +]; + +max_dist = max([for(n = noised) n[2]]); + +for(n = noised) { + c = abs(n[2] / max_dist); + color([c, c, c]) + linear_extrude(n[2] + 0.1) + translate([n[0], n[1]]) + square(1); +} \ No newline at end of file diff --git a/src/experimental/nz_cells.scad b/src/experimental/nz_cells.scad new file mode 100644 index 00000000..c06035a6 --- /dev/null +++ b/src/experimental/nz_cells.scad @@ -0,0 +1,5 @@ +use ; + +function nz_cells(cells, p, dist = "euclidean") = + dist == "border" ? _nz_cells_border(cells, p) : + _nz_cells_classic(cells, p, dist); \ No newline at end of file