This commit is contained in:
Simon Gardling 2022-03-09 22:25:06 -05:00
parent 8ab13c79c3
commit c0ef293da9
4 changed files with 78 additions and 10 deletions

View File

@ -18,3 +18,5 @@
8. Keybinds
9. nth derivative support (again)
10. Update function tests
11. rewrite FunctionEntry to move more information and handling to egui_app (such as config changes)
12. dynamically adjust newton iterations and resolution of graph based on performance and if the machine is lagging

View File

@ -263,6 +263,10 @@ struct AppSettings {
// Stores whether or not dark mode is enabled
pub dark_mode: bool,
pub extrema: bool,
pub roots: bool,
}
impl Default for AppSettings {
@ -276,6 +280,8 @@ impl Default for AppSettings {
integral_max_x: DEFAULT_MAX_X,
integral_num: DEFAULT_INTEGRAL_NUM,
dark_mode: true,
extrema: true,
roots: true,
}
}
}
@ -323,6 +329,29 @@ impl MathApp {
ui.selectable_value(&mut self.settings.sum, RiemannSum::Right, "Right");
});
let mut extrema_toggled: bool = false;
let mut roots_toggled: bool = false;
ui.horizontal(|ui| {
extrema_toggled = ui
.add(Button::new("Extrema"))
.on_hover_text(match self.settings.extrema {
true => "Disable Displaying Extrema",
false => "Display Extrema",
})
.clicked();
roots_toggled = ui
.add(Button::new("Roots"))
.on_hover_text(match self.settings.roots {
true => "Disable Displaying Roots",
false => "Display Roots",
})
.clicked();
});
self.settings.extrema.bitxor_assign(extrema_toggled);
self.settings.roots.bitxor_assign(roots_toggled);
let min_x_old = self.settings.integral_min_x;
let min_x_changed = ui
.add(
@ -359,6 +388,12 @@ impl MathApp {
)
.changed();
let configs_changed = max_x_changed
| min_x_changed
| integral_num_changed
| roots_toggled
| extrema_toggled;
let functions_len = self.functions.len();
let mut remove_i: Option<usize> = None;
for (i, function) in self.functions.iter_mut().enumerate() {
@ -405,11 +440,9 @@ impl MathApp {
});
let proc_func_str = process_func_str(self.func_strs[i].clone());
if integral_toggle
if configs_changed
| integral_toggle
| derivative_toggle
| max_x_changed
| min_x_changed
| integral_num_changed
| (proc_func_str != function.get_func_str())
| self.last_error.iter().any(|ele| ele.0 == i)
{
@ -434,6 +467,8 @@ impl MathApp {
Some(self.settings.integral_max_x),
Some(self.settings.integral_num),
Some(self.settings.sum),
self.settings.extrema,
self.settings.roots,
);
self.last_error = self
.last_error

View File

@ -42,6 +42,8 @@ pub struct FunctionEntry {
integral_max_x: f64,
integral_num: usize,
sum: RiemannSum,
roots: bool,
extrema: bool,
}
// How many times should newton's method iterate?
@ -63,12 +65,15 @@ impl FunctionEntry {
integral_max_x: f64::NAN,
integral_num: 0,
sum: DEFAULT_RIEMANN,
roots: true,
extrema: true,
}
}
pub fn update(
&mut self, func_str: String, integral: bool, derivative: bool, integral_min_x: Option<f64>,
integral_max_x: Option<f64>, integral_num: Option<usize>, sum: Option<RiemannSum>,
extrema: bool, roots: bool,
) {
// If the function string changes, just wipe and restart from scratch
if func_str != self.func_str {
@ -79,6 +84,8 @@ impl FunctionEntry {
self.derivative = derivative;
self.integral = integral;
self.extrema = extrema;
self.roots = roots;
// Makes sure proper arguments are passed when integral is enabled
if integral
@ -289,7 +296,14 @@ impl FunctionEntry {
continue;
}
if last_ele.unwrap().y.signum() != ele.y.signum() {
let last_ele_signum = last_ele.unwrap().y.signum();
let ele_signum = ele.y.signum();
if last_ele_signum.is_nan() | ele_signum.is_nan() {
continue;
}
if last_ele_signum != ele_signum {
// Do 50 iterations of newton's method, should be more than accurate
let x = {
let mut x1: f64 = last_ele.unwrap().x;
@ -317,7 +331,14 @@ impl FunctionEntry {
continue;
}
if last_ele.unwrap().y.signum() != ele.y.signum() {
let last_ele_signum = last_ele.unwrap().y.signum();
let ele_signum = ele.y.signum();
if last_ele_signum.is_nan() | ele_signum.is_nan() {
continue;
}
if last_ele_signum != ele_signum {
// Do 50 iterations of newton's method, should be more than accurate
let x = {
let mut x1: f64 = last_ele.unwrap().x;
@ -341,8 +362,18 @@ impl FunctionEntry {
self.output.back = Some(back_values);
self.output.integral = integral;
self.output.derivative = derivative;
self.extrema();
self.roots();
if self.extrema {
self.extrema();
} else {
self.output.extrema = None;
}
if self.roots {
self.roots();
} else {
self.output.roots = None;
}
self.output.display(
plot_ui,

View File

@ -1,7 +1,7 @@
use exmex::prelude::*;
lazy_static::lazy_static! {
static ref EMPTY_FUNCTION: FlatEx<f64> = exmex::parse::<f64>("0").unwrap();
static ref EMPTY_FUNCTION: FlatEx<f64> = exmex::parse::<f64>("0/0").unwrap();
}
#[derive(Clone)]