big changes

This commit is contained in:
Simon Gardling 2022-03-03 09:58:04 -05:00
parent cee67810b4
commit 7421549a88
4 changed files with 72 additions and 24 deletions

View File

@ -1,7 +1,7 @@
#![allow(clippy::too_many_arguments)] // Clippy, shut #![allow(clippy::too_many_arguments)] // Clippy, shut
#[allow(unused_imports)] #[allow(unused_imports)]
use crate::misc::debug_log; use crate::misc::{debug_log, SteppedVector};
use eframe::egui::{ use eframe::egui::{
plot::{BarChart, Line, Value, Values}, plot::{BarChart, Line, Value, Values},
@ -104,20 +104,17 @@ impl Function {
let resolution: f64 = self.pixel_width as f64 / (max_x.abs() + min_x.abs()); let resolution: f64 = self.pixel_width as f64 / (max_x.abs() + min_x.abs());
let back_cache = self.back_cache.as_ref().unwrap(); let back_cache = self.back_cache.as_ref().unwrap();
let x_data: Vec<f64> = back_cache.iter().map(|ele| ele.x).collect(); let x_data: SteppedVector = back_cache
.iter()
.map(|ele| ele.x)
.collect::<Vec<f64>>()
.into();
self.back_cache = Some( self.back_cache = Some(
(0..=self.pixel_width) (0..=self.pixel_width)
.map(|x| (x as f64 / resolution as f64) + min_x) .map(|x| (x as f64 / resolution as f64) + min_x)
.map(|x| { .map(|x| {
// If x is outside of previous bounds, just go ahead and just skip searching for the index if let Some(i) = x_data.get_index(x) {
if (x < self.min_x) | (self.max_x < x) {
return Value::new(x, self.run_func(x));
}
let i_option = x_data.iter().position(|&r| r == x); // Optimize this later, this could be done much much better, but tbh it doesn't matter that much as the program is already super fast
if let Some(i) = i_option {
back_cache[i] back_cache[i]
} else { } else {
Value::new(x, self.run_func(x)) Value::new(x, self.run_func(x))
@ -149,22 +146,19 @@ impl Function {
self.back_cache.as_ref().unwrap().clone() self.back_cache.as_ref().unwrap().clone()
})); }));
match self.integral { let front_bars = match self.integral {
true => { true => {
let front_bars: (BarChart, f64) = {
if self.front_cache.is_none() { if self.front_cache.is_none() {
let (data, area) = self.integral_rectangles(); let (data, area) = self.integral_rectangles();
self.front_cache = self.front_cache =
Some((data.iter().map(|(x, y)| Bar::new(*x, *y)).collect(), area)); Some((data.iter().map(|(x, y)| Bar::new(*x, *y)).collect(), area));
} }
let cache = self.front_cache.as_ref().unwrap(); let cache = self.front_cache.as_ref().unwrap();
(BarChart::new(cache.0.clone()), cache.1) Some((BarChart::new(cache.0.clone()), cache.1))
}
false => None,
}; };
(back_values, front_bars)
(back_values, Some(front_bars))
}
false => (back_values, None),
}
} }
// Creates and does the math for creating all the rectangles under the graph // Creates and does the math for creating all the rectangles under the graph

View File

@ -1,5 +1,6 @@
#![allow(clippy::unused_unit)] // Fixes clippy keep complaining about wasm_bindgen #![allow(clippy::unused_unit)] // Fixes clippy keep complaining about wasm_bindgen
#![feature(const_mut_refs)] #![feature(const_mut_refs)]
#![feature(total_cmp)]
mod egui_app; mod egui_app;
mod function; mod function;

View File

@ -1,4 +1,6 @@
#![feature(const_mut_refs)] #![feature(const_mut_refs)]
#![feature(total_cmp)]
mod egui_app; mod egui_app;
mod function; mod function;
mod misc; mod misc;

View File

@ -135,6 +135,57 @@ pub fn test_func(function_string: String) -> Option<String> {
None None
} }
pub struct SteppedVector {
data: Vec<f64>, // Assumes data is sorted from min to maximum
min: f64,
max: f64,
step: f64,
}
impl SteppedVector {
pub fn get_index(&self, x: f64) -> Option<usize> {
if (x > self.max) | (self.min > x) {
return None;
}
// Should work....
let possible_i = ((x + self.min) / self.step) as usize;
if self.data[possible_i] == x {
return Some(possible_i);
} else if (x >= self.min) && (self.max >= x) {
panic!("possible_i did not result in a possible value, but x is in range");
// Panic in case (no clue how this would happen). I may remove this check later.
}
// Not really needed as the above code should handle everything
/*
for (i, ele) in self.data.iter().enumerate() {
if ele > &x {
return None;
} else if &x == ele {
return Some(i);
}
}
*/
None
}
}
impl From<Vec<f64>> for SteppedVector {
// Note: input `data` is assumed to be sorted from min to max
fn from(data: Vec<f64>) -> SteppedVector {
let max = data[0];
let min = data[data.len() - 1];
let step = (max - min).abs() / ((data.len() - 1) as f64);
SteppedVector {
data,
min,
max,
step,
}
}
}
// Rounds f64 to specific number of digits // Rounds f64 to specific number of digits
pub fn digits_precision(x: f64, digits: usize) -> f64 { pub fn digits_precision(x: f64, digits: usize) -> f64 {
let large_number: f64 = 10.0_f64.powf(digits as f64); let large_number: f64 = 10.0_f64.powf(digits as f64);