From 4a26673b754b26f30316816997a40a78788a146d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 29 Mar 2020 16:57:04 +0800 Subject: [PATCH] add nz_voronoi2 --- src/experimental/_impl/_nz_voronoi2_impl.scad | 32 +++++++++++++++++++ src/experimental/demo/nz_voronoi2_demo.scad | 19 +++++++++++ src/experimental/nz_voronoi2.scad | 11 +++++++ 3 files changed, 62 insertions(+) create mode 100644 src/experimental/_impl/_nz_voronoi2_impl.scad create mode 100644 src/experimental/demo/nz_voronoi2_demo.scad create mode 100644 src/experimental/nz_voronoi2.scad diff --git a/src/experimental/_impl/_nz_voronoi2_impl.scad b/src/experimental/_impl/_nz_voronoi2_impl.scad new file mode 100644 index 00000000..31294317 --- /dev/null +++ b/src/experimental/_impl/_nz_voronoi2_impl.scad @@ -0,0 +1,32 @@ +use ; +use ; + +function _neighbors(fcord, seed, dim, m, n) = [ + for(y = [-1:1]) + for(x = [-1:1]) + let( + nx = fcord[0] + x, + ny = fcord[1] + y, + sd_base = nx + ny * dim, + sd1 = _lookup_noise_table(seed + sd_base), + sd2 = _lookup_noise_table(sd1 * 255 + sd_base), + nbr = [(nx + sd1) * m, (ny + sd2) * n] + ) + nbr +]; + +function _nz_voronoi2(p, seed, dim, m, n) = + let( + fcord = [floor(p[0] / m), floor(p[1] / n)], + nbrs = _neighbors(fcord, seed, dim, m, n), + dists = [ + for(nbr = nbrs) + if(!is_undef(nbr[1])) // Here's a workaround for a weired undef problem. bug of 2019.05? + [nbr[0], nbr[1], norm(nbr - p)] + ], + sorted = sort(dists, by = "z"), + a = [sorted[0][0], sorted[0][1]], + b = [sorted[1][0], sorted[1][1]], + m = (a + b) / 2 + ) + (p - m) * (a - m); \ No newline at end of file diff --git a/src/experimental/demo/nz_voronoi2_demo.scad b/src/experimental/demo/nz_voronoi2_demo.scad new file mode 100644 index 00000000..f22ec14d --- /dev/null +++ b/src/experimental/demo/nz_voronoi2_demo.scad @@ -0,0 +1,19 @@ +use ; + +size = [100, 50]; +dim = 5; +seed = 5; + +points = [ + for(y = [0:size[1] - 1]) + for(x = [0:size[0] - 1]) + [x, y, nz_voronoi2(size, x, y, seed, dim)] +]; + +max_dist = max([for(p = points) p[2]]); +for(p = points) { + c = p[2] / max_dist; + color([c, c, c]) + translate([p[0], p[1]]) + square(1); +} \ No newline at end of file diff --git a/src/experimental/nz_voronoi2.scad b/src/experimental/nz_voronoi2.scad new file mode 100644 index 00000000..dc2e6721 --- /dev/null +++ b/src/experimental/nz_voronoi2.scad @@ -0,0 +1,11 @@ +use ; +use ; + +function nz_voronoi2(size, x, y, seed, dim = 2) = + let( + sd = 6 + (is_undef(seed) ? floor(rand(0, 256)) : seed % 256), + // m*n pixels per grid + m = size[0] / dim, + n = size[1] / dim + ) + _nz_voronoi2([x, y], sd, dim, m, n); \ No newline at end of file