1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-09-25 05:51:41 +02:00
Files
dotSCAD/src/noise/_impl/_nz_cell_impl.scad
Justin Lin 0a41e6bcc1 refactor
2022-03-06 17:18:11 +08:00

33 lines
991 B
OpenSCAD

use <../../util/sort.scad>;
use <../../util/sum.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_cell_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_cell_border(cells, p) =
let(
dists = [
for(i = [0:len(cells) - 1])
[each 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);