anl/
implicit_scale_offset.rs1use super::implicit_base::{ImplicitModuleBase, ScalarParameter};
4use super::ImplicitModule;
5
6use std::rc::Rc;
7use std::cell::RefCell;
8
9pub 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}