diff --git a/src/experimental/_impl/_nz_worley2_impl.scad b/src/experimental/_impl/_nz_worley2_impl.scad index 839d72c1..7c9b767c 100644 --- a/src/experimental/_impl/_nz_worley2_impl.scad +++ b/src/experimental/_impl/_nz_worley2_impl.scad @@ -1,27 +1,45 @@ use ; +use ; -function _neighbors(fcord, seed, dim, m, n) = [ +function _neighbors(fcord, seed, cell_w) = [ for(y = [-1:1]) for(x = [-1:1]) let( nx = fcord[0] + x, ny = fcord[1] + y, - sd_base = nx + ny * dim, + sd_base = nx + ny * cell_w, sd1 = _lookup_noise_table(seed + sd_base), sd2 = _lookup_noise_table(sd1 * 255 + sd_base), - nbr = [(nx + sd1) * m, (ny + sd2) * n] + nbr = [(nx + sd1) * cell_w, (ny + sd2) * cell_w] ) nbr ]; - -function _nz_worley2(p, seed, dim, m, n, dist) = + +function _nz_worley2_classic(p, nbrs, dist) = + min([ + for(nbr = nbrs) + if(!is_undef(nbr[1])) // Here's a workaround for a weired undef problem. bug of 2019.05? + _distance(nbr, p, dist) + ]); + +function _nz_worley2_border(p, nbrs, dist) = 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? - _distance(nbr, p, dist) - ] + [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 ) - min(dists); \ No newline at end of file + (p - m) * (a - m); + +function _nz_worley2(p, seed, cell_w, dist) = + let( + fcord = [floor(p[0] / cell_w), floor(p[1] / cell_w)], + nbrs = _neighbors(fcord, seed, cell_w) + ) + dist == "border" ? _nz_worley2_border(p, nbrs, dist) : + _nz_worley2_classic(p, nbrs, dist); \ No newline at end of file diff --git a/src/experimental/_impl/_nz_worley3_impl.scad b/src/experimental/_impl/_nz_worley3_impl.scad index 6706a32b..850d5ba0 100644 --- a/src/experimental/_impl/_nz_worley3_impl.scad +++ b/src/experimental/_impl/_nz_worley3_impl.scad @@ -1,6 +1,7 @@ use ; +use ; -function _neighbors(fcord, seed, dim, m, n, o) = [ +function _neighbors(fcord, seed, cell_w) = [ for(z = [-1:1]) for(y = [-1:1]) for(x = [-1:1]) @@ -8,23 +9,40 @@ function _neighbors(fcord, seed, dim, m, n, o) = [ nx = fcord[0] + x, ny = fcord[1] + y, nz = fcord[2] + z, - sd_base = nx + ny * dim + nz * dim * dim, + sd_base = nx + ny * cell_w + nz * cell_w * cell_w, sd1 = _lookup_noise_table(seed + sd_base), sd2 = _lookup_noise_table(sd1 * 255 + sd_base), sd3 = _lookup_noise_table(sd2 * 255 + sd_base), - nbr = [(nx + sd1) * m, (ny + sd2) * n, (nz + sd3) * o] + nbr = [(nx + sd1) * cell_w, (ny + sd2) * cell_w, (nz + sd3) * cell_w] ) nbr ]; - -function _nz_worley3(p, seed, dim, m, n, o, dist) = + +function _nz_worley3_classic(p, nbrs, dist) = + min([ + for(nbr = nbrs) + if(!is_undef(nbr[1])) // Here's a workaround for a weired undef problem. bug of 2019.05? + _distance(nbr, p, dist) + ]); + +function _nz_worley3_border(p, nbrs, dist) = let( - fcord = [floor(p[0] / m), floor(p[1] / n), floor(p[2] / o)], - nbrs = _neighbors(fcord, seed, dim, m, n, o), dists = [ for(nbr = nbrs) if(!is_undef(nbr[1])) // Here's a workaround for a weired undef problem. bug of 2019.05? - _distance(nbr, p, dist) - ] + [nbr[0], nbr[1], nbr[2], norm(nbr - p)] + ], + sorted = sort(dists, by = "idx", idx = 3), + a = [sorted[0][0], sorted[0][1], sorted[0][2]], + b = [sorted[1][0], sorted[1][1], sorted[1][2]], + m = (a + b) / 2 ) - min(dists); \ No newline at end of file + (p - m) * (a - m); + +function _nz_worley3(p, seed, cell_w, dist) = + let( + fcord = [floor(p[0] / cell_w), floor(p[1] / cell_w), floor(p[2] / cell_w)], + nbrs = _neighbors(fcord, seed, cell_w) + ) + dist == "border" ? _nz_worley3_border(p, nbrs, dist) : + _nz_worley3_classic(p, nbrs, dist); \ No newline at end of file diff --git a/src/experimental/demo/nz_voronoi2_demo.scad b/src/experimental/demo/nz_voronoi2_demo.scad deleted file mode 100644 index f22ec14d..00000000 --- a/src/experimental/demo/nz_voronoi2_demo.scad +++ /dev/null @@ -1,19 +0,0 @@ -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/demo/nz_voronoi2s_demo.scad b/src/experimental/demo/nz_voronoi2s_demo.scad deleted file mode 100644 index 7d512c17..00000000 --- a/src/experimental/demo/nz_voronoi2s_demo.scad +++ /dev/null @@ -1,21 +0,0 @@ -use ; - -size = [100, 50]; -dim = 5; -seed = 5; - -points = [ - for(y = [0:size[1] - 1]) - for(x = [0:size[0] - 1]) - [x, y] -]; - -noises = nz_voronoi2s(size, points, seed, dim); - -max_dist = max(noises); -for(i = [0:len(noises) - 1]) { - c = noises[i] / max_dist; - color([c, c, c]) - translate(points[i]) - square(1); -} \ No newline at end of file diff --git a/src/experimental/demo/nz_voronoi3_demo.scad b/src/experimental/demo/nz_voronoi3_demo.scad deleted file mode 100644 index 24e9a877..00000000 --- a/src/experimental/demo/nz_voronoi3_demo.scad +++ /dev/null @@ -1,21 +0,0 @@ -use ; - -size = [20, 20, 20]; -dim = 2; -seed = 1; - -points = [ - for(z = [0:size[2] - 1]) - for(y = [0:size[1] - 1]) - for(x = [0:size[0] - 1]) - [x, y, z, nz_voronoi3(size, x, y, z, seed, dim)] -]; - -max_dist = max([for(p = points) p[3]]); - -for(p = points) { - c = p[3] / max_dist * 2; - color([c > 1 ? 1 : c , 0, 0]) - translate([p[0], p[1], p[2]]) - cube(1); -} \ No newline at end of file diff --git a/src/experimental/demo/nz_voronoi3s_demo.scad b/src/experimental/demo/nz_voronoi3s_demo.scad deleted file mode 100644 index 527132f0..00000000 --- a/src/experimental/demo/nz_voronoi3s_demo.scad +++ /dev/null @@ -1,22 +0,0 @@ -use ; - -size = [20, 20, 20]; -dim = 2; -seed = 5; - -points = [ - for(z = [0:size[2] - 1]) - for(y = [0:size[1] - 1]) - for(x = [0:size[0] - 1]) - [x, y, z] -]; - -noises = nz_voronoi3s(size, points, seed, dim); - -max_dist = max(noises); -for(i = [0:len(noises) - 1]) { - c = noises[i] / max_dist * 2; - color([c > 1 ? 1 : c , 0, 0]) - translate(points[i]) - square(1); -} \ No newline at end of file diff --git a/src/experimental/demo/nz_worley2_demo.scad b/src/experimental/demo/nz_worley2_demo.scad index 538a52d7..7e50a802 100644 --- a/src/experimental/demo/nz_worley2_demo.scad +++ b/src/experimental/demo/nz_worley2_demo.scad @@ -1,14 +1,14 @@ use ; size = [100, 50]; -dim = 5; -dist = "euclidean"; // [euclidean, manhattan, chebyshev] -seed = 5; +cell_w = 10; +dist = "euclidean"; // [euclidean, manhattan, chebyshev, border] +seed = 51; points = [ for(y = [0:size[1] - 1]) for(x = [0:size[0] - 1]) - [x, y, nz_worley2(size, x, y, seed, dim, dist)] + [x, y, nz_worley2(x, y, seed, cell_w, dist)] ]; max_dist = max([for(p = points) p[2]]); diff --git a/src/experimental/demo/nz_worley2s_demo.scad b/src/experimental/demo/nz_worley2s_demo.scad index ca2eade8..8d2e8fae 100644 --- a/src/experimental/demo/nz_worley2s_demo.scad +++ b/src/experimental/demo/nz_worley2s_demo.scad @@ -1,8 +1,8 @@ use ; size = [100, 50]; -dim = 5; -dist = "euclidean"; // [euclidean, manhattan, chebyshev] +cell_w = 10; +dist = "euclidean"; // [euclidean, manhattan, chebyshev, border] seed = 5; points = [ @@ -11,7 +11,7 @@ points = [ [x, y] ]; -noises = nz_worley2s(size, points, seed, dim, dist); +noises = nz_worley2s(points, seed, cell_w, dist); max_dist = max(noises); for(i = [0:len(noises) - 1]) { diff --git a/src/experimental/demo/nz_worley3_demo.scad b/src/experimental/demo/nz_worley3_demo.scad index 3705da80..bf0094fe 100644 --- a/src/experimental/demo/nz_worley3_demo.scad +++ b/src/experimental/demo/nz_worley3_demo.scad @@ -1,15 +1,15 @@ use ; size = [20, 20, 20]; -dim = 5; -dist = "euclidean"; // [euclidean, manhattan, chebyshev] +cell_w = 5; +dist = "euclidean"; // [euclidean, manhattan, chebyshev, border] seed = 5; points = [ for(z = [0:size[2] - 1]) for(y = [0:size[1] - 1]) for(x = [0:size[0] - 1]) - [x, y, z, nz_worley3(size, x, y, z, seed, dim, dist)] + [x, y, z, nz_worley3(x, y, z, seed, cell_w, dist)] ]; max_dist = max([for(p = points) p[3]]); diff --git a/src/experimental/demo/nz_worley3s_demo.scad b/src/experimental/demo/nz_worley3s_demo.scad index db60279c..f2fdeb83 100644 --- a/src/experimental/demo/nz_worley3s_demo.scad +++ b/src/experimental/demo/nz_worley3s_demo.scad @@ -1,8 +1,8 @@ use ; size = [20, 20, 20]; -dim = 5; -dist = "euclidean"; // [euclidean, manhattan, chebyshev] +cell_w = 5; +dist = "euclidean"; // [euclidean, manhattan, chebyshev, border] seed = 5; points = [ @@ -12,7 +12,7 @@ points = [ [x, y, z] ]; -noises = nz_worley3s(size, points, seed, dim, dist); +noises = nz_worley3s(points, seed, cell_w, dist); max_dist = max(noises); diff --git a/src/experimental/nz_voronoi2.scad b/src/experimental/nz_voronoi2.scad deleted file mode 100644 index dc2e6721..00000000 --- a/src/experimental/nz_voronoi2.scad +++ /dev/null @@ -1,11 +0,0 @@ -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 diff --git a/src/experimental/nz_voronoi2s.scad b/src/experimental/nz_voronoi2s.scad deleted file mode 100644 index 58231757..00000000 --- a/src/experimental/nz_voronoi2s.scad +++ /dev/null @@ -1,11 +0,0 @@ -use ; -use ; - -function nz_voronoi2s(size, points, 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 - ) - [for(p = points) _nz_voronoi2(p, sd, dim, m, n)]; \ No newline at end of file diff --git a/src/experimental/nz_voronoi3.scad b/src/experimental/nz_voronoi3.scad deleted file mode 100644 index 6ce7d304..00000000 --- a/src/experimental/nz_voronoi3.scad +++ /dev/null @@ -1,12 +0,0 @@ -use ; -use ; - -function nz_voronoi3(size, x, y, z, 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, - o = size[2] / dim - ) - _nz_voronoi3([x, y, z], sd, dim, m, n, o); \ No newline at end of file diff --git a/src/experimental/nz_voronoi3s.scad b/src/experimental/nz_voronoi3s.scad deleted file mode 100644 index 18e431fc..00000000 --- a/src/experimental/nz_voronoi3s.scad +++ /dev/null @@ -1,12 +0,0 @@ -use ; -use ; - -function nz_voronoi3s(size, points, 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, - o = size[2] / dim - ) - [for(p = points) _nz_voronoi3(p, sd, dim, m, n, o)]; \ No newline at end of file diff --git a/src/experimental/nz_worley2.scad b/src/experimental/nz_worley2.scad index a5b6c7aa..b40aa170 100644 --- a/src/experimental/nz_worley2.scad +++ b/src/experimental/nz_worley2.scad @@ -1,11 +1,6 @@ use ; use ; -function nz_worley2(size, x, y, seed, dim = 2, dist = "euclidean") = - 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_worley2([x, y], sd, dim, m, n, dist); \ No newline at end of file +function nz_worley2(x, y, seed, cell_w = 10, dist = "euclidean") = + let(sd = 6 + (is_undef(seed) ? floor(rand(0, 256)) : seed % 256)) + _nz_worley2([x, y], sd, cell_w, dist); \ No newline at end of file diff --git a/src/experimental/nz_worley2s.scad b/src/experimental/nz_worley2s.scad index f9abfe46..a23bd739 100644 --- a/src/experimental/nz_worley2s.scad +++ b/src/experimental/nz_worley2s.scad @@ -1,11 +1,6 @@ use ; use ; -function nz_worley2s(size, points, seed, dim = 2, dist = "euclidean") = - 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 - ) - [for(p = points) _nz_worley2(p, sd, dim, m, n, dist)]; \ No newline at end of file +function nz_worley2s(points, seed, cell_w = 10, dist = "euclidean") = + let(sd = 6 + (is_undef(seed) ? floor(rand(0, 256)) : seed % 256)) + [for(p = points) _nz_worley2(p, sd, cell_w, dist)]; \ No newline at end of file diff --git a/src/experimental/nz_worley3.scad b/src/experimental/nz_worley3.scad index 381a3266..2ae8b27e 100644 --- a/src/experimental/nz_worley3.scad +++ b/src/experimental/nz_worley3.scad @@ -1,12 +1,6 @@ use ; use ; -function nz_worley3(size, x, y, z, seed, dim = 2, dist = "euclidean") = - 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, - o = size[2] / dim - ) - _nz_worley3([x, y, z], sd, dim, m, n, o, dist); \ No newline at end of file +function nz_worley3(x, y, z, seed, cell_w = 10, dist = "euclidean") = + let(sd = 6 + (is_undef(seed) ? floor(rand(0, 256)) : seed % 256)) + _nz_worley3([x, y, z], sd, cell_w, dist); \ No newline at end of file diff --git a/src/experimental/nz_worley3s.scad b/src/experimental/nz_worley3s.scad index 91c65c9d..8c3e2b1e 100644 --- a/src/experimental/nz_worley3s.scad +++ b/src/experimental/nz_worley3s.scad @@ -1,12 +1,6 @@ use ; use ; -function nz_worley3s(size, points, seed, dim = 2, dist = "euclidean") = - 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, - o = size[2] / dim - ) - [for(p = points) _nz_worley3(p, sd, dim, m, n, o, dist)]; \ No newline at end of file +function nz_worley3s(points, seed, cell_w = 10, dist = "euclidean") = + let(sd = 6 + (is_undef(seed) ? floor(rand(0, 256)) : seed % 256)) + [for(p = points) _nz_worley3(p, sd, cell_w, dist)]; \ No newline at end of file