1use ndarray::Array3;
2use palette::{Gradient, LinSrgba};
3use std::{ops::AddAssign, path::PathBuf};
4
5use crate::colours::slice;
6
7pub struct Data {
9 pub scatters: Array3<f64>,
11 pub travelled: Array3<f64>,
13 pub total: usize,
15 pub absorbed: usize,
17 pub escaped: usize,
19}
20
21impl Data {
22 #[inline]
24 #[must_use]
25 pub fn new(num_voxels: [usize; 3]) -> Self {
26 Self {
27 scatters: Array3::zeros((num_voxels[0], num_voxels[1], num_voxels[2])),
28 travelled: Array3::zeros((num_voxels[0], num_voxels[1], num_voxels[2])),
29 total: 0,
30 absorbed: 0,
31 escaped: 0,
32 }
33 }
34
35 #[inline]
37 pub fn save(&self, colour_map: &Gradient<LinSrgba>, path: &PathBuf, step: usize) {
38 slice(
39 self.scatters.view(),
40 colour_map,
41 &path.join("scatters"),
42 &format!("{0:>3}", step),
43 );
44 slice(
45 self.travelled.view(),
46 colour_map,
47 &path.join("distance"),
48 &format!("{0:>3}", step),
49 );
50 }
51}
52
53impl AddAssign<&Self> for Data {
54 #[inline]
55 fn add_assign(&mut self, rhs: &Self) {
56 self.scatters += &rhs.scatters;
57 self.travelled += &rhs.travelled;
58 self.total += rhs.total;
59 self.absorbed += rhs.absorbed;
60 self.escaped += rhs.escaped;
61 }
62}