From 0b0821a8039ce22987a84d7196129fe0c24c92e7 Mon Sep 17 00:00:00 2001 From: fabolous005 Date: Tue, 16 Jan 2024 20:53:35 +0100 Subject: [PATCH] renew file structure --- Cargo.toml | 1 + grid_image.png | Bin 0 -> 764587 bytes src/function.rs | 149 +++++++++++++++++++++++++++++++++++++++ src/image.rs | 21 ++++++ src/main.rs | 182 ++++++++++++------------------------------------ 5 files changed, 214 insertions(+), 139 deletions(-) create mode 100644 grid_image.png create mode 100644 src/function.rs create mode 100644 src/image.rs diff --git a/Cargo.toml b/Cargo.toml index 32ad5c4..3d0d767 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] meval = "0.2.0" +image = "0.24.8" diff --git a/grid_image.png b/grid_image.png new file mode 100644 index 0000000000000000000000000000000000000000..32e65877a9f4e9b819ece7be38715abe670dbb7e GIT binary patch literal 764587 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

tms5haDg}@6SJLPA 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 -> [[f64;2];3] { + let mut points: [[f64; 2]; 3] = [[0.0; 2]; 3]; + + for (i, part) in args.iter().enumerate().take(3) { + let values: Vec = part + .split(':') + .filter_map(|s| s.parse().ok()) + .collect(); + + if values.len() == 2 { + points[i][0] = values[0]; + points[i][1] = values[1]; + } else { + println!("Invalid input format: {}", part); + println!("Usage: $0 -1:1 3:-5 10:1.5") + } + } + + #[cfg(debug_assertions)] + default_points(&mut points); + + points +} + +fn nearest_to_zero(arr: &[[f64;2];3]) -> usize { + let mut nearest = arr[1][1]; + let mut nearest_index = 0; + for (i, point) in arr.iter().enumerate() { + if nearest < point[1].abs() { + nearest = point[i-1]; + nearest_index = i-1; + } + } + nearest_index +} + +pub fn straight_string(m: f64, points: &[[f64;2];3]) -> String { + format!( + "{}x{}", + if m != 1.0 { + format!("{} * ", m) + } else { + "".to_string() + }, + { + let lowest_y = nearest_to_zero(points); + let result = points[lowest_y][0] - points[lowest_y][1] * m; + if result != 0.0 { + format!( + "{}{}", + if result < 0.0 { + " - ".to_string() + } else { + " + ".to_string() + }, + result.abs() + ) + } else { + "".to_string() + } + } + ) +} + +pub fn square_string(points: &[[f64;2];3]) -> String { + let a = -((points[0][0] * points[1][1] - + points[0][0] * points[2][1] - + points[1][0] * points[0][1] + + points[1][0] * points[2][1] + + points[2][0] * points[0][1] - + points[2][0] * points[1][1]) + / + ((points[0][0] - points[1][0]) * + (points[0][0] - points[2][0]) * + (points[1][0] - points[2][0]))); + + let b = (points[0][0].powi(2) * points[1][1] - + points[0][0].powi(2) * points[2][1] - + points[1][0].powi(2) * points[0][1] + + points[1][0].powi(2) * points[2][1] + + points[2][0].powi(2) * points[0][1] - + points[2][0].powi(2) * points[1][1]) + / + ((points[0][0] - points[1][0]) * + (points[0][0] - points[2][0]) * + (points[1][0] - points[2][0])); + + let c = (points[0][0].powi(2) * points[1][0] * points[2][1] - + points[0][0].powi(2) * points[2][0] * points[1][1] - + points[0][0] * points[1][0].powi(2) * points[2][1] + + points[0][0] * points[2][0].powi(2) * points[1][1] + + points[1][0].powi(2) * points[2][0] * points[0][1] - + points[1][0] * points[2][0].powi(2) * points[0][1]) + / + ((points[0][0] - points[1][0]) * + (points[0][0] - points[2][0]) * + (points[1][0] - points[2][0])); + + format!( + "{}x^2{}{}", + if a == -1.0 { + "-".to_string() + } else if a != 1.0 { + format!("{}{}", a, " * ") + } else { + "".to_string() + }, + if b != 0.0 { + format!( + "{}{}", + if b < 0.0 { + " - ".to_string() + } else { + " + ".to_string() + }, + if b != 1.0 { + format!("{} * x", b.abs()) + } else { + "x".to_string() + } + ) + } else { + "".to_string() + }, + if c != 0.0 { + format!( + "{}{}", + if c < 0.0 { + " - ".to_string() + } else { + " + ".to_string() + }, + c.abs() + ) + } else { + "".to_string() + } + ) +} diff --git a/src/image.rs b/src/image.rs new file mode 100644 index 0000000..0c8e285 --- /dev/null +++ b/src/image.rs @@ -0,0 +1,21 @@ +use image::{ImageBuffer, RgbImage, Rgb}; + +pub fn get_image(width: u32, height: u32) -> ImageBuffer, Vec> { + let mut img = RgbImage::new(width, height); + let grid_spacing = 100; + let grid_color = Rgb([255,9,255]); + + for x in (0..width).step_by(grid_spacing) { + for y in 0..height { + img.put_pixel(x, y, grid_color); + } + } + for y in (0..height).step_by(grid_spacing) { + for x in 0..width { + img.put_pixel(x, y, grid_color); + } + } + img +} + + diff --git a/src/main.rs b/src/main.rs index 6ec17c8..2334a6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,27 +1,13 @@ use std::env; +mod function; +mod image; +use crate::function::*; + fn main() { let args: Vec = env::args().skip(1).take(3).collect(); - let mut points: [[f64; 2]; 3] = [[0.0; 2]; 3]; - - for (i, part) in args.iter().enumerate().take(3) { - let values: Vec = part - .split(':') - .filter_map(|s| s.parse().ok()) - .collect(); - - if values.len() == 2 { - points[i][0] = values[0]; - points[i][1] = values[1]; - } else { - println!("Invalid input format: {}", part); - println!("Usage: $0 -1:1 3:-5 10:1.5") - } - } - - #[cfg(debug_assertions)] - default_points(&mut points); + let mut points = get_points(args); group_by_x(&mut points); let m1 = (points[0][1] - points[1][1]) / (points[0][0] - points[1][0]); @@ -34,135 +20,53 @@ fn main() { if function.contains("NaN") { panic!("Contains NaN, this is probably the result of bad math"); } - // let expr2 = tokenize(function.as_str()).unwrap(); - // println!("{:?}", expr2); + let rust_function = function.parse::().unwrap().bind("x").unwrap(); let result = rust_function(9.0); println!("{}", result); -} -fn default_points(points: &mut [[f64;2];3]) { - if points.iter().all(|row| row.iter().all(|&x| x == 0.0)) { - *points = [[-1.0,1.0], [2.0,4.0], [3.0,9.0]]; + /* + let width = 7000; + let height = 7000; + let color = [255, 0, 0]; + let mut img = get_image(4000, 4000); + let step: f64 = format!("0.{}1", "0".repeat(6)).parse().unwrap(); + let mut points = vec![]; + + let mut i = 0.0; + while i <= 3.0 { + points.push(i); + i += step; } -} -fn group_by_x(arr: &mut [[f64;2];3]) { - arr.sort_by(|a, b| a[0].partial_cmp(&b[0]).unwrap_or(std::cmp::Ordering::Equal)); -} -fn nearest_to_zero(arr: &[[f64;2];3]) -> usize { - let mut nearest = arr[1][1]; - let mut nearest_index = 0; - for (i, point) in arr.iter().enumerate() { - if nearest < point[1].abs() { - nearest = point[i-1]; - nearest_index = i-1; + // println!("{points:?}"); + + + let mut x; + let mut y; + // let mut x_result_tmp; + // let mut y_result_tmp; + for point in points { + // NOTE: convert later to u32 because deviding may change actual value + x = point * 1000.0_f64; + y = rust_function(point) * 1000.0; + if width as f64 / 2.0 + y < (width - 5) as f64 { + img.put_pixel( + (width as f64 / 2.0 + x).round() as u32, + (height as f64 / 2.0 - y) as u32, + Rgb(color) + ); + img.put_pixel( + (width as f64 / 2.0 - x).round() as u32, + (height as f64 / 2.0 - y).round() as u32, + Rgb(color) + ); } } - nearest_index + + img.save("grid_image.png").expect("Failed to save image"); + */ } -fn straight_string(m: f64, points: &[[f64;2];3]) -> String { - format!( - "{}x{}", - if m != 1.0 { - format!("{} * ", m) - } else { - "".to_string() - }, - { - let lowest_y = nearest_to_zero(points); - let result = points[lowest_y][0] - points[lowest_y][1] * m; - if result != 0.0 { - format!( - "{}{}", - if result < 0.0 { - " - ".to_string() - } else { - " + ".to_string() - }, - result.abs() - ) - } else { - "".to_string() - } - } - ) -} -fn square_string(points: &[[f64;2];3]) -> String { - let a = -((points[0][0] * points[1][1] - - points[0][0] * points[2][1] - - points[1][0] * points[0][1] + - points[1][0] * points[2][1] + - points[2][0] * points[0][1] - - points[2][0] * points[1][1]) - / - ((points[0][0] - points[1][0]) * - (points[0][0] - points[2][0]) * - (points[1][0] - points[2][0]))); - - let b = (points[0][0].powi(2) * points[1][1] - - points[0][0].powi(2) * points[2][1] - - points[1][0].powi(2) * points[0][1] + - points[1][0].powi(2) * points[2][1] + - points[2][0].powi(2) * points[0][1] - - points[2][0].powi(2) * points[1][1]) - / - ((points[0][0] - points[1][0]) * - (points[0][0] - points[2][0]) * - (points[1][0] - points[2][0])); - - let c = (points[0][0].powi(2) * points[1][0] * points[2][1] - - points[0][0].powi(2) * points[2][0] * points[1][1] - - points[0][0] * points[1][0].powi(2) * points[2][1] + - points[0][0] * points[2][0].powi(2) * points[1][1] + - points[1][0].powi(2) * points[2][0] * points[0][1] - - points[1][0] * points[2][0].powi(2) * points[0][1]) - / - ((points[0][0] - points[1][0]) * - (points[0][0] - points[2][0]) * - (points[1][0] - points[2][0])); - - format!( - "{}x^2{}{}", - if a == -1.0 { - "-".to_string() - } else if a != 1.0 { - format!("{}{}", a, " * ") - } else { - "".to_string() - }, - if b != 0.0 { - format!( - "{}{}", - if b < 0.0 { - " - ".to_string() - } else { - " + ".to_string() - }, - if b != 1.0 { - format!("{} * x", b.abs()) - } else { - "x".to_string() - } - ) - } else { - "".to_string() - }, - if c != 0.0 { - format!( - "{}{}", - if c < 0.0 { - " - ".to_string() - } else { - " + ".to_string() - }, - c.abs() - ) - } else { - "".to_string() - } - ) -}