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