diff --git a/src/chart/types/chart_series.rs b/src/chart/types/chart_series.rs index af2220b3..2dacf37e 100644 --- a/src/chart/types/chart_series.rs +++ b/src/chart/types/chart_series.rs @@ -63,6 +63,29 @@ pub(super) fn get_max(&self) -> f32 { } } +pub(super) fn sample_spline(spline: &Spline, multiplier: f32) -> Vec<(f32, f32)> { + let len = spline.len(); + let pts = len * 10; // 10 samples per key + let mut ret_val = Vec::new(); + let first_x = spline + .get(0) + .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) + .t; + let last_x = spline + .get(len.saturating_sub(1)) + .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) + .t; + #[allow(clippy::cast_precision_loss)] + let delta = (last_x - first_x) / (pts as f32 - 1.0); + for i in 0..pts { + #[allow(clippy::cast_precision_loss)] + let x = first_x + delta * i as f32; + let p = spline.clamped_sample(x).unwrap_or_default() * multiplier; + ret_val.push((x, p)); + } + ret_val +} + fn reduce_all_time_data(all_time: &mut Vec<(f32, f32)>) { // bisect data until we have less than 150 points while all_time.len() > 150 { diff --git a/src/chart/types/preview_chart.rs b/src/chart/types/preview_chart.rs index d4ebecd5..8bf88620 100644 --- a/src/chart/types/preview_chart.rs +++ b/src/chart/types/preview_chart.rs @@ -5,9 +5,8 @@ use plotters::prelude::*; use plotters::series::LineSeries; use plotters_iced::{Chart, ChartBuilder, ChartWidget, DrawingBackend}; -use splines::{Interpolation, Key, Spline}; -use crate::chart::types::chart_series::ChartSeries; +use crate::chart::types::chart_series::{ChartSeries, sample_spline}; use crate::gui::styles::style_constants::CHARTS_LINE_BORDER; use crate::gui::styles::types::palette::to_rgb_color; use crate::gui::types::message::Message; @@ -101,7 +100,7 @@ fn area_series(&self) -> AreaSeries { let data = match spline.keys() { // if we have only one tick, we need to add a second point to draw the area [k] => vec![(0.0, k.value), (0.1, k.value)], - _ => sample_spline(spline), + _ => sample_spline(spline, 1.0), }; AreaSeries::new(data, 0.0, color.mix(alpha.into())) @@ -162,34 +161,11 @@ fn build_chart( } } -fn sample_spline(spline: &Spline) -> Vec<(f32, f32)> { - let pts = spline.len() * 10; // 10 samples per key - let mut ret_val = Vec::new(); - let len = spline.len(); - let first_x = spline - .get(0) - .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) - .t; - let last_x = spline - .get(len.saturating_sub(1)) - .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) - .t; - #[allow(clippy::cast_precision_loss)] - let delta = (last_x - first_x) / (pts as f32 - 1.0); - for i in 0..pts { - #[allow(clippy::cast_precision_loss)] - let x = first_x + delta * i as f32; - let p = spline.clamped_sample(x).unwrap_or_default(); - ret_val.push((x, p)); - } - ret_val -} - #[cfg(test)] mod tests { use splines::{Interpolation, Key, Spline}; - use crate::chart::types::traffic_chart::sample_spline; + use crate::chart::types::chart_series::sample_spline; #[test] fn test_spline_samples() { diff --git a/src/chart/types/traffic_chart.rs b/src/chart/types/traffic_chart.rs index d0e4703c..60b55a37 100644 --- a/src/chart/types/traffic_chart.rs +++ b/src/chart/types/traffic_chart.rs @@ -8,9 +8,9 @@ use plotters::prelude::*; use plotters::series::LineSeries; use plotters_iced::{Chart, ChartBuilder, ChartWidget, DrawingBackend}; -use splines::{Interpolation, Key, Spline}; +use splines::Spline; -use crate::chart::types::chart_series::ChartSeries; +use crate::chart::types::chart_series::{ChartSeries, sample_spline}; use crate::gui::sniffer::FONT_FAMILY_NAME; use crate::gui::styles::style_constants::CHARTS_LINE_BORDER; use crate::gui::styles::types::palette::to_rgb_color; @@ -403,29 +403,6 @@ fn build_chart( } } -fn sample_spline(spline: &Spline, multiplier: f32) -> Vec<(f32, f32)> { - let pts = spline.len() * 10; // 10 samples per key - let mut ret_val = Vec::new(); - let len = spline.len(); - let first_x = spline - .get(0) - .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) - .t; - let last_x = spline - .get(len.saturating_sub(1)) - .unwrap_or(&Key::new(0.0, 0.0, Interpolation::Cosine)) - .t; - #[allow(clippy::cast_precision_loss)] - let delta = (last_x - first_x) / (pts as f32 - 1.0); - for i in 0..pts { - #[allow(clippy::cast_precision_loss)] - let x = first_x + delta * i as f32; - let p = spline.clamped_sample(x).unwrap_or_default() * multiplier; - ret_val.push((x, p)); - } - ret_val -} - #[cfg(test)] mod tests { use splines::{Interpolation, Key, Spline};