simplify function output handling
This commit is contained in:
parent
4371c25fb5
commit
da140f1a06
@ -3,7 +3,7 @@ use std::ops::RangeInclusive;
|
|||||||
use crate::function::Function;
|
use crate::function::Function;
|
||||||
use crate::misc::{add_asterisks, digits_precision, test_func};
|
use crate::misc::{add_asterisks, digits_precision, test_func};
|
||||||
use eframe::{egui, epi};
|
use eframe::{egui, epi};
|
||||||
use egui::plot::{Line, Plot, Values};
|
use egui::plot::Plot;
|
||||||
use egui::widgets::plot::BarChart;
|
use egui::widgets::plot::BarChart;
|
||||||
use egui::widgets::Button;
|
use egui::widgets::Button;
|
||||||
use egui::{Color32, FontData, FontFamily, Vec2};
|
use egui::{Color32, FontData, FontFamily, Vec2};
|
||||||
@ -246,18 +246,15 @@ impl epi::App for MathApp {
|
|||||||
|
|
||||||
function.update_bounds(minx_bounds, maxx_bounds, available_width);
|
function.update_bounds(minx_bounds, maxx_bounds, available_width);
|
||||||
|
|
||||||
let output = function.run();
|
let (back_values, bars) = function.run();
|
||||||
let back = output.get_back();
|
plot_ui.line(back_values.color(Color32::RED));
|
||||||
plot_ui.line(Line::new(Values::from_values(back)).color(Color32::RED));
|
|
||||||
|
|
||||||
if output.has_integral() {
|
if bars.is_some() {
|
||||||
let (bars, area) = output.get_front();
|
let (bars, area) = bars.unwrap();
|
||||||
let bar_chart =
|
plot_ui.bar_chart(BarChart::new(bars).color(Color32::BLUE).width(step));
|
||||||
BarChart::new(bars.clone()).color(Color32::BLUE).width(step);
|
|
||||||
plot_ui.bar_chart(bar_chart);
|
|
||||||
area_list.push(digits_precision(area, 8))
|
area_list.push(digits_precision(area, 8))
|
||||||
} else {
|
} else {
|
||||||
area_list.push(0.0);
|
area_list.push(f64::NAN);
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,33 +1,12 @@
|
|||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use crate::misc::debug_log;
|
use crate::misc::debug_log;
|
||||||
|
|
||||||
use eframe::egui::{plot::Value, widgets::plot::Bar};
|
use eframe::egui::{
|
||||||
|
plot::{Line, Value, Values},
|
||||||
|
widgets::plot::Bar,
|
||||||
|
};
|
||||||
use meval::Expr;
|
use meval::Expr;
|
||||||
|
|
||||||
// Struct that stores and manages the output of a function
|
|
||||||
pub struct FunctionOutput {
|
|
||||||
// The actual line graph
|
|
||||||
back: Vec<Value>,
|
|
||||||
|
|
||||||
// Integral information
|
|
||||||
front: Option<(Vec<Bar>, f64)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FunctionOutput {
|
|
||||||
pub fn new(back: Vec<Value>, front: Option<(Vec<Bar>, f64)>) -> Self { Self { back, front } }
|
|
||||||
|
|
||||||
pub fn get_back(&self) -> Vec<Value> { self.back.clone() }
|
|
||||||
|
|
||||||
pub fn get_front(&self) -> (Vec<Bar>, f64) {
|
|
||||||
match &self.front {
|
|
||||||
Some(x) => (x.0.clone(), x.1),
|
|
||||||
None => panic!(""),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn has_integral(&self) -> bool { self.front.is_some() }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Function {
|
pub struct Function {
|
||||||
function: Box<dyn Fn(f64) -> f64>,
|
function: Box<dyn Fn(f64) -> f64>,
|
||||||
pub(crate) func_str: String,
|
pub(crate) func_str: String,
|
||||||
@ -199,8 +178,8 @@ impl Function {
|
|||||||
|
|
||||||
pub fn is_integral(&self) -> bool { self.integral }
|
pub fn is_integral(&self) -> bool { self.integral }
|
||||||
|
|
||||||
pub fn run(&mut self) -> FunctionOutput {
|
pub fn run(&mut self) -> (Line, Option<(Vec<Bar>, f64)>) {
|
||||||
let back_values: Vec<Value> = match self.back_cache.is_some() {
|
let back_values: Line = Line::new(Values::from_values(match self.back_cache.is_some() {
|
||||||
true => {
|
true => {
|
||||||
debug_log("back_cache: using");
|
debug_log("back_cache: using");
|
||||||
self.back_cache.as_ref().unwrap().clone()
|
self.back_cache.as_ref().unwrap().clone()
|
||||||
@ -219,7 +198,7 @@ impl Function {
|
|||||||
self.back_cache = Some(back_data.clone());
|
self.back_cache = Some(back_data.clone());
|
||||||
back_data
|
back_data
|
||||||
}
|
}
|
||||||
};
|
}));
|
||||||
|
|
||||||
if self.integral {
|
if self.integral {
|
||||||
let front_bars: (Vec<Bar>, f64) = match self.front_cache.is_some() {
|
let front_bars: (Vec<Bar>, f64) = match self.front_cache.is_some() {
|
||||||
@ -239,9 +218,9 @@ impl Function {
|
|||||||
output
|
output
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
FunctionOutput::new(back_values, Some(front_bars))
|
(back_values, Some(front_bars))
|
||||||
} else {
|
} else {
|
||||||
FunctionOutput::new(back_values, None)
|
(back_values, None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user