#[derive(Debug, Clone)]
pub struct NarrowBandSdf {
pub nx: usize,
pub ny: usize,
pub nz: usize,
pub dx: f64,
pub origin: [f64; 3],
pub bandwidth: f64,
pub values: Vec<f64>,
}
impl NarrowBandSdf {
pub fn from_function<F>(
f: &F,
nx: usize,
ny: usize,
nz: usize,
dx: f64,
origin: [f64; 3],
bandwidth: f64,
) -> Self
where
F: Fn([f64; 3]) -> f64,
{
let mut values = vec![f64::MAX; nx * ny * nz];
for iz in 0..nz {
for iy in 0..ny {
for ix in 0..nx {
let p = [
origin[0] + ix as f64 * dx,
origin[1] + iy as f64 * dx,
origin[2] + iz as f64 * dx,
];
let d = f(p);
if d.abs() <= bandwidth {
values[iz * ny * nx + iy * nx + ix] = d;
}
}
}
}
Self {
nx,
ny,
nz,
dx,
origin,
bandwidth,
values,
}
}
pub fn at(&self, ix: usize, iy: usize, iz: usize) -> f64 {
self.values[iz * self.ny * self.nx + iy * self.nx + ix]
}
pub fn in_band(&self, ix: usize, iy: usize, iz: usize) -> bool {
self.at(ix, iy, iz).abs() < self.bandwidth
}
pub fn active_count(&self) -> usize {
self.values.iter().filter(|&&v| v != f64::MAX).count()
}
}