1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-09 08:16:50 +02:00

add nz_cells

This commit is contained in:
Justin Lin
2020-03-31 11:12:09 +08:00
parent 5401b718b7
commit 2d7093b792
3 changed files with 66 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
use <experimental/sum.scad>;
use <util/sort.scad>;
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);

View File

@@ -0,0 +1,28 @@
use <experimental/nz_cells.scad>;
use <golden_spiral.scad>;
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);
}

View File

@@ -0,0 +1,5 @@
use <experimental/_impl/_nz_cells_impl.scad>;
function nz_cells(cells, p, dist = "euclidean") =
dist == "border" ? _nz_cells_border(cells, p) :
_nz_cells_classic(cells, p, dist);