dear_implot3d/plots/
scatter.rs

1use super::{Plot3D, Plot3DError, validate_lengths, validate_nonempty};
2use crate::{Plot3DUi, Scatter3DFlags};
3
4pub struct Scatter3D<'a> {
5    pub label: &'a str,
6    pub xs_f32: Option<&'a [f32]>,
7    pub ys_f32: Option<&'a [f32]>,
8    pub zs_f32: Option<&'a [f32]>,
9    pub xs_f64: Option<&'a [f64]>,
10    pub ys_f64: Option<&'a [f64]>,
11    pub zs_f64: Option<&'a [f64]>,
12    pub flags: Scatter3DFlags,
13    pub offset: i32,
14    pub stride: i32,
15}
16
17impl<'a> Scatter3D<'a> {
18    pub fn f32(label: &'a str, xs: &'a [f32], ys: &'a [f32], zs: &'a [f32]) -> Self {
19        Self {
20            label,
21            xs_f32: Some(xs),
22            ys_f32: Some(ys),
23            zs_f32: Some(zs),
24            xs_f64: None,
25            ys_f64: None,
26            zs_f64: None,
27            flags: Scatter3DFlags::NONE,
28            offset: 0,
29            stride: 0,
30        }
31    }
32    pub fn f64(label: &'a str, xs: &'a [f64], ys: &'a [f64], zs: &'a [f64]) -> Self {
33        Self {
34            label,
35            xs_f32: None,
36            ys_f32: None,
37            zs_f32: None,
38            xs_f64: Some(xs),
39            ys_f64: Some(ys),
40            zs_f64: Some(zs),
41            flags: Scatter3DFlags::NONE,
42            offset: 0,
43            stride: 0,
44        }
45    }
46    pub fn flags(mut self, flags: Scatter3DFlags) -> Self {
47        self.flags = flags;
48        self
49    }
50    pub fn offset(mut self, o: i32) -> Self {
51        self.offset = o;
52        self
53    }
54    pub fn stride(mut self, s: i32) -> Self {
55        self.stride = s;
56        self
57    }
58}
59
60impl<'a> Plot3D for Scatter3D<'a> {
61    fn label(&self) -> &str {
62        self.label
63    }
64    fn try_plot(&self, ui: &Plot3DUi<'_>) -> Result<(), Plot3DError> {
65        if let (Some(x), Some(y), Some(z)) = (self.xs_f32, self.ys_f32, self.zs_f32) {
66            validate_nonempty(x)?;
67            validate_lengths(x, y, "x/y")?;
68            validate_lengths(y, z, "y/z")?;
69            ui.plot_scatter_f32_raw(self.label, x, y, z, self.flags, self.offset, self.stride);
70            Ok(())
71        } else if let (Some(x), Some(y), Some(z)) = (self.xs_f64, self.ys_f64, self.zs_f64) {
72            validate_nonempty(x)?;
73            validate_lengths(x, y, "x/y")?;
74            validate_lengths(y, z, "y/z")?;
75            ui.plot_scatter_f64_raw(self.label, x, y, z, self.flags, self.offset, self.stride);
76            Ok(())
77        } else {
78            Err(Plot3DError::EmptyData)
79        }
80    }
81}