dear_implot3d/plots/
scatter.rs1use 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}