Skip to main content

conspire/geometry/mesh/smooth/taubin/
mod.rs

1#[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}