diff --git a/TODO.md b/TODO.md index d9d837e..0880b73 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,5 @@ ## TODO: -1. Port to [egui](https://github.com/emilk/egui) - - Proper support for dynamic chart display size. - - Fix (rare) crashes in parsing strings (`TextDecoder.decode: Decoding failed.`) -2. Multiple functions in one graph. -3. Non `y=` functions. \ No newline at end of file +1. Proper support for dynamic chart display size. +2. Fix (very rare) crashes in parsing strings (`TextDecoder.decode: Decoding failed.`) +3. Multiple functions in one graph. +4. Non `y=` functions. \ No newline at end of file diff --git a/src/chart_manager.rs b/src/chart_manager.rs index e2ffb31..53c825f 100644 --- a/src/chart_manager.rs +++ b/src/chart_manager.rs @@ -12,18 +12,23 @@ pub struct ChartManager { function: Function, min_x: f64, max_x: f64, + min_x_back: f64, + max_x_back: f64, num_interval: usize, resolution: usize, } impl ChartManager { pub fn new( - func_str: String, min_x: f64, max_x: f64, num_interval: usize, resolution: usize, + func_str: String, min_x: f64, max_x: f64, min_x_back: f64, max_x_back: f64, + num_interval: usize, resolution: usize, ) -> Self { Self { function: Function::from_string(func_str), min_x, max_x, + min_x_back, + max_x_back, num_interval, resolution, } @@ -31,9 +36,9 @@ impl ChartManager { #[inline] pub fn draw_back(&mut self) -> Vec<(f64, f64)> { - let absrange = (self.max_x - self.min_x).abs(); + let absrange = (self.max_x_back - self.min_x_back).abs(); let output: Vec<(f64, f64)> = (1..=self.resolution) - .map(|x| ((x as f64 / self.resolution as f64) * absrange) + self.min_x) + .map(|x| ((x as f64 / self.resolution as f64) * absrange) + self.min_x_back) .map(|x| (x, self.function.run(x))) .collect(); output @@ -49,15 +54,19 @@ impl ChartManager { #[allow(clippy::too_many_arguments)] pub fn update( - &mut self, func_str_new: String, min_x: f64, max_x: f64, num_interval: usize, - resolution: usize, + &mut self, func_str_new: String, min_x: f64, max_x: f64, min_x_back: f64, max_x_back: f64, + num_interval: usize, resolution: usize, ) -> UpdateType { let func_str: String = add_asterisks(func_str_new); let update_func: bool = !self.function.str_compare(func_str.clone()); - let update_back = update_func | (min_x != self.min_x) | (max_x != self.max_x); - let update_front = - update_back | (self.resolution != resolution) | (num_interval != self.num_interval); + let update_back = + update_func | (min_x_back != self.min_x_back) | (max_x_back != self.max_x_back); + let update_front = update_func + | (min_x != self.min_x) + | (max_x != self.max_x) + | (self.resolution != resolution) + | (num_interval != self.num_interval); if update_func { self.function = Function::from_string(func_str); @@ -65,6 +74,8 @@ impl ChartManager { self.min_x = min_x; self.max_x = max_x; + self.min_x_back = min_x_back; + self.max_x_back = max_x_back; self.num_interval = num_interval; self.resolution = resolution; diff --git a/src/egui_app.rs b/src/egui_app.rs index 11b4153..6917605 100644 --- a/src/egui_app.rs +++ b/src/egui_app.rs @@ -11,10 +11,21 @@ use git_version::git_version; // Grabs git version on compile time const GIT_VERSION: &str = git_version!(); +// Sets some hard-coded limits to the application +const NUM_INTERVAL_RANGE: RangeInclusive = 10..=10000; +const MIN_X_TOTAL: f64 = -1000.0; +const MAX_X_TOTAL: f64 = 1000.0; +const X_RANGE: RangeInclusive = MIN_X_TOTAL..=MAX_X_TOTAL; + pub struct MathApp { func_str: String, min_x: f64, max_x: f64, + + // Currently really unused. But once fully implemented it will represent the full graph's min_x and max_x, being seperate from min_x and max_x for the intergral. + min_x_graph: f64, + max_x_graph: f64, + num_interval: usize, resolution: usize, chart_manager: ChartManager, @@ -34,12 +45,16 @@ impl Default for MathApp { func_str: def_func.clone(), min_x: def_min_x, max_x: def_max_x, + min_x_graph: def_min_x, + max_x_graph: def_max_x, num_interval: def_interval, resolution: def_resolution, chart_manager: ChartManager::new( def_func, def_min_x, def_max_x, + def_min_x, + def_max_x, def_interval, def_resolution, ), @@ -86,12 +101,6 @@ impl MathApp { } } -// Sets some hard-coded limits to the application -const NUM_INTERVAL_RANGE: RangeInclusive = 10..=10000; -const MIN_X_TOTAL: f32 = -1000.0; -const MAX_X_TOTAL: f32 = 1000.0; -const X_RANGE: RangeInclusive = MIN_X_TOTAL as f64..=MAX_X_TOTAL as f64; - impl epi::App for MathApp { fn name(&self) -> &str { "Integral Demonstration" } @@ -107,6 +116,8 @@ impl epi::App for MathApp { func_str, min_x, max_x, + min_x_graph, + max_x_graph, num_interval, resolution, chart_manager, @@ -162,6 +173,8 @@ impl epi::App for MathApp { *min_x = -10.0; *max_x = 10.0; } + *min_x_graph = *min_x; + *max_x_graph = *max_x; } ui.add(egui::Slider::new(num_interval, NUM_INTERVAL_RANGE).text("Interval")); @@ -195,8 +208,15 @@ impl epi::App for MathApp { }); if parse_error.is_empty() { - let do_update = - chart_manager.update(func_str.clone(), *min_x, *max_x, *num_interval, *resolution); + let do_update = chart_manager.update( + func_str.clone(), + *min_x, + *max_x, + *min_x_graph, + *max_x_graph, + *num_interval, + *resolution, + ); // Invalidates caches according to what settings were changed match do_update { @@ -224,6 +244,7 @@ impl epi::App for MathApp { Plot::new("plot") .view_aspect(1.0) + .data_aspect(1.0) .include_y(0) .show(ui, |plot_ui| { plot_ui.line(curve);