From 098ced8092f7d8c00c3e5f3954695fa04a1f7e96 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Wed, 16 Feb 2022 11:26:03 -0500 Subject: [PATCH] use AreaSeries when num_interval is over 200 --- src/lib.rs | 38 ++++++++++++++++++++++++++++++-------- src/misc.rs | 4 +--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5e4bce6..577395b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ use std::panic; use wasm_bindgen::prelude::*; use web_sys::HtmlCanvasElement; mod misc; -use crate::misc::{ChartOutput, DrawResult, Cache}; +use crate::misc::{Cache, ChartOutput, DrawResult}; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; @@ -87,14 +87,18 @@ impl ChartManager { let output: Vec<(f32, f32)> = (1..=self.resolution) .map(|x| ((x as f32 / self.resolution as f32) * absrange) + self.min_x) .map(|x| (x, func(x as f64) as f32)) - .filter(|(_, y)| &self.min_y <= y && y <= &self.max_y) .collect(); self.back_cache.set(output.clone()); output } }; - chart.draw_series(LineSeries::new(data, &RED))?; + let filtered_data: Vec<(f32, f32)> = data + .iter() + .filter(|(_, y)| &self.min_y <= y && y <= &self.max_y) + .map(|(x, y)| (*x, *y)) + .collect(); + chart.draw_series(LineSeries::new(filtered_data, &RED))?; let (rect_data, area): (Vec<(f32, f32, f32)>, f32) = match self.front_cache.is_valid() { true => self.front_cache.get().clone(), @@ -107,12 +111,30 @@ impl ChartManager { } }; - // Draw rectangles - chart.draw_series( - rect_data + if self.num_interval <= 200 { + // Draw rectangles + chart.draw_series( + rect_data + .iter() + .map(|(x1, x2, y)| Rectangle::new([(*x2, *y), (*x1, 0.0)], &BLUE)), + )?; + } else { + // Save resources by not graphing rectangles and using an AreaSeries when you can no longer see the rectangles + let capped_data: Vec<(f32, f32)> = data .iter() - .map(|(x1, x2, y)| Rectangle::new([(*x2, *y), (*x1, 0.0)], &BLUE)), - )?; + .map(|(x, y)| { + let new_y: &f32 = if y > &self.max_y { + &self.max_y + } else if &self.min_y > y { + &self.min_y + } else { + &y + }; + (*x, *new_y) + }) + .collect(); + chart.draw_series(AreaSeries::new(capped_data, 0.0, &BLUE))?; + } root.present()?; Ok((chart.into_coord_trans(), area)) diff --git a/src/misc.rs b/src/misc.rs index 41d8f02..1bc2cbb 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -78,7 +78,5 @@ impl Cache { } #[inline] - pub fn is_valid(&self) -> bool { - self.valid - } + pub fn is_valid(&self) -> bool { self.valid } }