cleanup
This commit is contained in:
parent
a56165236e
commit
be2d6a2f71
@ -5,11 +5,11 @@ use web_sys::HtmlCanvasElement;
|
|||||||
use meval::Expr;
|
use meval::Expr;
|
||||||
|
|
||||||
/// Draw power function f(x) = x^power.
|
/// Draw power function f(x) = x^power.
|
||||||
pub fn draw(element: HtmlCanvasElement, func_str: &str, minX: f32, maxX: f32, minY: f32, maxY: f32, num_interval: usize, resolution: i32) -> DrawResult<(impl Fn((i32, i32))-> Option<(f32, f32)>, f32)> {
|
pub fn draw(element: HtmlCanvasElement, func_str: &str, min_x: f32, max_x: f32, min_y: f32, max_y: f32, num_interval: usize, resolution: i32) -> DrawResult<(impl Fn((i32, i32))-> Option<(f32, f32)>, f32)> {
|
||||||
let expr: Expr = func_str.parse().unwrap();
|
let expr: Expr = func_str.parse().unwrap();
|
||||||
let func = expr.bind("x").unwrap();
|
let func = expr.bind("x").unwrap();
|
||||||
|
|
||||||
let absrange = (maxX-minX).abs();
|
let absrange = (max_x-min_x).abs();
|
||||||
let step = absrange/(num_interval as f32);
|
let step = absrange/(num_interval as f32);
|
||||||
let backend = CanvasBackend::with_canvas_object(element).unwrap();
|
let backend = CanvasBackend::with_canvas_object(element).unwrap();
|
||||||
|
|
||||||
@ -23,18 +23,18 @@ pub fn draw(element: HtmlCanvasElement, func_str: &str, minX: f32, maxX: f32, mi
|
|||||||
.caption(format!("y={}", func_str), font)
|
.caption(format!("y={}", func_str), font)
|
||||||
.x_label_area_size(30 as f32)
|
.x_label_area_size(30 as f32)
|
||||||
.y_label_area_size(30 as f32)
|
.y_label_area_size(30 as f32)
|
||||||
.build_cartesian_2d(minX..maxX, minY..maxY)?;
|
.build_cartesian_2d(min_x..max_x, min_y..max_y)?;
|
||||||
|
|
||||||
chart.configure_mesh().x_labels(3).y_labels(3).draw()?;
|
chart.configure_mesh().x_labels(3).y_labels(3).draw()?;
|
||||||
|
|
||||||
let data = (1..=resolution)
|
let data = (1..=resolution)
|
||||||
.map(|x| (((x as f32/resolution as f32))*(&absrange))+&minX)
|
.map(|x| (((x as f32/resolution as f32))*(&absrange))+&min_x)
|
||||||
.map(|x| (x, func(x as f64) as f32))
|
.map(|x| (x, func(x as f64) as f32))
|
||||||
.filter(|(_,y)| &minY <= y && y <= &maxY);
|
.filter(|(_,y)| &min_y <= y && y <= &max_y);
|
||||||
|
|
||||||
chart.draw_series(LineSeries::new(data, &RED))?;
|
chart.draw_series(LineSeries::new(data, &RED))?;
|
||||||
|
|
||||||
let (data2, area) = integral_rectangles(minX, minY, maxY, step, num_interval, &func); // Get rectangle coordinates and the total area
|
let (data2, area) = integral_rectangles(min_x, step, num_interval, &func); // Get rectangle coordinates and the total area
|
||||||
|
|
||||||
// Draw rectangles
|
// Draw rectangles
|
||||||
chart.draw_series(data2.iter().map(|(x1, x2, y)| Rectangle::new([(*x2, *y), (*x1, 0.0)], &BLUE)))?;
|
chart.draw_series(data2.iter().map(|(x1, x2, y)| Rectangle::new([(*x2, *y), (*x1, 0.0)], &BLUE)))?;
|
||||||
@ -46,7 +46,7 @@ pub fn draw(element: HtmlCanvasElement, func_str: &str, minX: f32, maxX: f32, mi
|
|||||||
|
|
||||||
// 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
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn integral_rectangles(minX: f32, minY: f32, maxY: f32, step: f32, num_interval: usize, func: &dyn Fn(f64) -> f64) -> (Vec<(f32, f32, f32)>, f32) {
|
fn integral_rectangles(min_x: f32, step: f32, num_interval: usize, func: &dyn Fn(f64) -> f64) -> (Vec<(f32, f32, f32)>, f32) {
|
||||||
let mut area: f32 = 0.0; // sum of all rectangles' areas
|
let mut area: f32 = 0.0; // sum of all rectangles' areas
|
||||||
let mut tmp1: f32; // Top left Y value that's tested
|
let mut tmp1: f32; // Top left Y value that's tested
|
||||||
let mut tmp2: f32; // Top right Y value that's tested
|
let mut tmp2: f32; // Top right Y value that's tested
|
||||||
@ -55,7 +55,7 @@ fn integral_rectangles(minX: f32, minY: f32, maxY: f32, step: f32, num_interval:
|
|||||||
let mut x: f32; // X value of the left side of the rectangle
|
let mut x: f32; // X value of the left side of the rectangle
|
||||||
let mut data2: Vec<(f32, f32, f32)> = Vec::new();
|
let mut data2: Vec<(f32, f32, f32)> = Vec::new();
|
||||||
for e in 0..num_interval {
|
for e in 0..num_interval {
|
||||||
x = ((e as f32)*step)+minX;
|
x = ((e as f32)*step)+min_x;
|
||||||
|
|
||||||
if x > 0.0 {
|
if x > 0.0 {
|
||||||
x2 = x+step;
|
x2 = x+step;
|
||||||
|
|||||||
10
src/lib.rs
10
src/lib.rs
@ -23,8 +23,8 @@ pub struct Point {
|
|||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
impl Chart {
|
impl Chart {
|
||||||
pub fn draw(canvas: HtmlCanvasElement, func: &str, minX: f32, maxX: f32, minY: f32, maxY: f32, num_interval: usize, resolution: i32) -> Result<Chart, JsValue> {
|
pub fn draw(canvas: HtmlCanvasElement, func: &str, min_x: f32, max_x: f32, min_y: f32, max_y: f32, num_interval: usize, resolution: i32) -> Result<Chart, JsValue> {
|
||||||
let output = func_plot::draw(canvas, func, minX, maxX, minY, maxY, num_interval, resolution).map_err(|err| err.to_string())?;
|
let output = func_plot::draw(canvas, func, min_x, max_x, min_y, max_y, num_interval, resolution).map_err(|err| err.to_string())?;
|
||||||
let map_coord = output.0;
|
let map_coord = output.0;
|
||||||
Ok(Chart {
|
Ok(Chart {
|
||||||
convert: Box::new(move |coord| map_coord(coord).map(|(x, y)| (x.into(), y.into()))),
|
convert: Box::new(move |coord| map_coord(coord).map(|(x, y)| (x.into(), y.into()))),
|
||||||
@ -36,12 +36,6 @@ impl Chart {
|
|||||||
return Ok(self.area);
|
return Ok(self.area);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does actual calculation of antiderivative
|
|
||||||
// pub fn actual_area(power: f32, minX: f32, maxX: f32) -> Result<f32, JsValue> {
|
|
||||||
// let newpower = power + 1.0;
|
|
||||||
// return Ok((maxX.powf(newpower as f32)/newpower) - (minX.powf(newpower as f32)/newpower));
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn coord(&self, x: i32, y: i32) -> Option<Point> {
|
pub fn coord(&self, x: i32, y: i32) -> Option<Point> {
|
||||||
(self.convert)((x, y)).map(|(x, y)| Point { x, y })
|
(self.convert)((x, y)).map(|(x, y)| Point { x, y })
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user