conspire/geometry/mesh/smooth/taubin/
mod.rs1#[cfg(test)]
2mod test;
3
4use crate::{
5 geometry::mesh::{Mesh, differential::laplace::Weighting},
6 math::Scalar,
7};
8
9impl<const D: usize> Mesh<D> {
10 pub fn taubin_smooth(
11 &mut self,
12 iterations: usize,
13 pass_band: Scalar,
14 scale: Scalar,
15 weighting: Weighting,
16 preserve_boundary: bool,
17 preserve_interfaces: bool,
18 ) {
19 let scale_deflate = scale;
20 let scale_inflate = scale / (pass_band * scale - 1.0);
21 let adjacency = (preserve_boundary || preserve_interfaces)
22 .then(|| self.constrained_adjacency(preserve_boundary, preserve_interfaces));
23 for iteration in 0..iterations {
24 let laplacian = match &adjacency {
25 Some(adjacency) => self.laplacian_over(adjacency, weighting),
26 None => self.laplacian(weighting),
27 };
28 let scale = if scale_inflate < 0.0 && iteration % 2 == 1 {
29 scale_inflate
30 } else {
31 scale_deflate
32 };
33 self.coordinates
34 .iter_mut()
35 .zip(laplacian)
36 .for_each(|(x, u)| *x -= u * scale)
37 }
38 }
39}