mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-09 16:26:47 +02:00
add nz_cells
This commit is contained in:
33
src/experimental/_impl/_nz_cells_impl.scad
Normal file
33
src/experimental/_impl/_nz_cells_impl.scad
Normal 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);
|
28
src/experimental/demo/nz_cells_demo.scad
Normal file
28
src/experimental/demo/nz_cells_demo.scad
Normal 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);
|
||||
}
|
5
src/experimental/nz_cells.scad
Normal file
5
src/experimental/nz_cells.scad
Normal 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);
|
Reference in New Issue
Block a user