anl/
implicit_scale_offset.rs

1/// The documentation is taken from original [C++ library by Joshua Tippetts](http://accidentalnoise.sourceforge.net/docs.html).
2
3use super::implicit_base::{ImplicitModuleBase, ScalarParameter};
4use super::ImplicitModule;
5
6use std::rc::Rc;
7use std::cell::RefCell;
8
9/// ScaleOffset applies a scaling and translation factor to the output of its source function, as `v*scale+offset`.
10pub struct ImplicitScaleOffset {
11    base: ImplicitModuleBase,
12    source: ScalarParameter,
13    scale: ScalarParameter,
14    offset: ScalarParameter,
15}
16
17impl ImplicitScaleOffset {
18    pub fn with_scale_offset(scale: f64, offset: f64) -> ImplicitScaleOffset {
19        ImplicitScaleOffset {
20            base: Default::default(),
21            source: ScalarParameter::Value(0.0),
22            scale: ScalarParameter::Value(scale),
23            offset: ScalarParameter::Value(offset),
24        }
25    }
26
27    pub fn set_source_module(&mut self, b: Rc<RefCell<ImplicitModule>>) {
28        self.source = ScalarParameter::Source(b);
29    }
30    pub fn set_source_value(&mut self, v: f64) {
31        self.source = ScalarParameter::Value(v);
32    }
33
34    pub fn set_scale_module(&mut self, b: Rc<RefCell<ImplicitModule>>) {
35        self.scale = ScalarParameter::Source(b);
36    }
37    pub fn set_scale_value(&mut self, v: f64) {
38        self.scale = ScalarParameter::Value(v);
39    }
40
41    pub fn set_offset_module(&mut self, b: Rc<RefCell<ImplicitModule>>) {
42        self.offset = ScalarParameter::Source(b);
43    }
44    pub fn set_offset_value(&mut self, v: f64) {
45        self.offset = ScalarParameter::Value(v);
46    }
47}
48
49impl ImplicitModule for ImplicitScaleOffset {
50    fn set_seed(&mut self, _: u32) {}
51
52    fn get_2d(&mut self, x: f64, y: f64) -> f64 {
53        self.source.get_2d(x, y) * self.scale.get_2d(x, y) + self.offset.get_2d(x, y)
54    }
55    fn get_3d(&mut self, x: f64, y: f64, z: f64) -> f64 {
56        self.source.get_3d(x, y, z) * self.scale.get_3d(x, y, z) + self.offset.get_3d(x, y, z)
57    }
58    fn get_4d(&mut self, x: f64, y: f64, z: f64, w: f64) -> f64 {
59        self.source.get_4d(x, y, z, w) * self.scale.get_4d(x, y, z, w) + self.offset.get_4d(x, y, z, w)
60    }
61    fn get_6d(&mut self, x: f64, y: f64, z: f64, w: f64, u: f64, v: f64) -> f64 {
62        self.source.get_6d(x, y, z, w, u, v) * self.scale.get_6d(x, y, z, w, u, v) + self.offset.get_6d(x, y, z, w, u, v)
63    }
64
65    fn spacing(&self) -> f64 {
66        self.base.spacing
67    }
68
69    fn set_deriv_spacing(&mut self, s: f64) {
70        self.base.spacing = s;
71    }
72}