From b89ad6932d49a5466c2daf4e58c06003493d2c2e Mon Sep 17 00:00:00 2001 From: dengqn Date: Sun, 3 Aug 2025 00:17:15 +0800 Subject: [PATCH] code clean --- src/image.rs | 137 --------------------------------------------------- src/main.rs | 103 +------------------------------------- 2 files changed, 1 insertion(+), 239 deletions(-) diff --git a/src/image.rs b/src/image.rs index d81da7e..3322262 100644 --- a/src/image.rs +++ b/src/image.rs @@ -44,82 +44,6 @@ pub fn gen_ray_sphere_normal_ppm_p3(width: i32, height: i32, camera_center: Vec3 img_content } - -pub fn gen_ray_sphere_ppm_p3(width: i32, height: i32, camera_center: Vec3, viewport_top_left_pixel_center: Vec3, viewport_u_delta: Vec3, viewport_v_delta: Vec3) -> String { - let mut img_content = format!("P3\n{} {}\n255\n", width, height); - - for j in 0..height { - - if j % 10 == 0 { - println!("scan line {}/{} ", j + 1, height); - } - - for i in 0..width { - // every pixcel's position - let pixel_center = viewport_top_left_pixel_center + (i as f32 * viewport_u_delta) + (j as f32 * viewport_v_delta); - // Vector(camera, pixcel) - let ray_direction = pixel_center - camera_center; - // ray - let r = Ray::new(camera_center, ray_direction); - - /* - 球 - */ - let _sphere_center = Point::new(0.0, 0.0, -1.0); - let sphere_radius = 0.5; - - // determind color - let color = ray_color_at_sphere(&r, _sphere_center, sphere_radius); - // content - img_content.push_str(color.to_color().as_str()); - img_content.push('\n'); - } - } - - img_content -} - - -pub fn gen_ray_ppm_p3(width: i32, height: i32, camera_center: Vec3, viewport_top_left_pixel_center: Vec3, viewport_u_delta: Vec3, viewport_v_delta: Vec3) -> String { - let mut img_content = format!("P3\n{} {}\n255\n", width, height); - - for j in 0..height { - - if j % 10 == 0 { - println!("scan line {}/{} ", j + 1, height); - } - - for i in 0..width { - // every pixcel's position - let pixel_center = viewport_top_left_pixel_center + (i as f32 * viewport_u_delta) + (j as f32 * viewport_v_delta); - // Vector(camera, pixcel) - let ray_direction = pixel_center - camera_center; - // ray - let r = Ray::new(camera_center, ray_direction); - // determind color - let color = ray_color(&r); - // content - img_content.push_str(color.to_color().as_str()); - img_content.push('\n'); - } - } - - img_content -} - - -/* -b^ - 4ac > 0 : 2 交点; = 0:1交点;< 0 : 无交点 -*/ -fn hit_sphere(r: &Ray, sphere_center: Point, sphere_radius: f32) -> bool { - let a = r.direction.dot(r.direction); - let b_sqrt = (-2.0 * (r.direction.dot(sphere_center - r.point))).powi(2); - let c = (sphere_center - r.point).dot(sphere_center - r.point) - sphere_radius.powi(2); - - return b_sqrt - 4.0 * a * c >= 0.0; -} - - fn hit_sphere_normal(r: &Ray, sphere_center: Point, sphere_radius: f32) -> f32 { let a: f32 = r.direction.length_squared(); let h = r.direction.dot(sphere_center - r.point); @@ -163,65 +87,4 @@ fn ray_color_at_sphere_normal(r: &Ray, sphere_center: Point, sphere_radius: f32) let unit_direction = r.direction / r.direction.length(); let a = 0.5*(unit_direction.y + 1.0); return (1.0-a)*Color::new(1.0, 1.0, 1.0) + a*Color::new(0.5, 0.7, 1.0); -} - -fn ray_color_at_sphere(r: &Ray, sphere_center: Point, sphere_radius: f32) -> Color { - - // return RED if hit sphere - if hit_sphere(r, sphere_center, sphere_radius) { - return Color::new(0.4, 0.4, 0.2); - } - - // v / |v| - let unit_direction = r.direction / r.direction.length(); - let a = 0.5*(unit_direction.y + 1.0); - return (1.0-a)*Color::new(1.0, 1.0, 1.0) + a*Color::new(0.5, 0.7, 1.0); -} - -fn ray_color(r: &Ray) -> Color { - // v / |v| - let unit_direction = r.direction / r.direction.length(); - let a = 0.5*(unit_direction.y + 1.0); - return (1.0-a)*Color::new(1.0, 1.0, 1.0) + a*Color::new(0.5, 0.7, 1.0); -} - - -/* -* -------width(i)------- -* | -* | -* height(j) -* | -* | -* ---------------------- -* -* ppm p3 format: -* -* P3 -* -* [width] [height] -* [max color] -* R1 G1 B1 -* R2 G2 B2 -* R3 G3 B3 -* ...xN -*/ -pub fn gen_gradient_ppm_p3(width: i32, height: i32) -> String { - let mut img_content = format!("P3\n{} {}\n255\n", width, height); - - for j in 0..height { - println!("scan line {}/{} ", j + 1, height); - for i in 0..width { - let r = i as f32 / (width-1) as f32; - let g = j as f32 / (height-1) as f32; - let b = (i+j) as f32 / (width + height - 2) as f32; - - let color = Color::new(r, g, b); - img_content.push_str(color.to_color().as_str()); - - img_content.push('\n'); - } - } - - img_content } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 2c5784f..3a80d9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,8 @@ use write_file_util::{write_image}; -use image::{gen_gradient_ppm_p3, gen_ray_ppm_p3, Color}; use vec3::{Vec3}; use point::{Point}; -use ray::{Ray}; -use crate::image::{gen_ray_sphere_normal_ppm_p3, gen_ray_sphere_ppm_p3}; +use crate::image::{gen_ray_sphere_normal_ppm_p3}; mod image; mod write_file_util; @@ -13,14 +11,7 @@ mod point; mod ray; fn main() { - gen_gradient_ppm(); - println!("=================================="); - ray_scene_render(); - println!("=================================="); - ray_sphere_scene_render(); - println!("=================================="); ray_sphere_normal_scene_render(); - println!("=================================="); } @@ -58,96 +49,4 @@ fn ray_sphere_normal_scene_render() { let ppm_content = gen_ray_sphere_normal_ppm_p3(image_width, image_height, camera_center, viewport_top_left_pixel_center, viewport_u_delta, viewport_v_delta); write_image(ppm_content, "./target/ray_sphere_normal_scene_render.ppm".to_string()) -} - -fn ray_sphere_scene_render() { - let aspect_ratio = 16.0/9.0; - let image_width = 400; - // aleast 1px - let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1); - - let viewport_height = 2.0; - let viewport_width = viewport_height * (image_width as f32 / image_height as f32); - - println!("set image({},{}), viewport({},{})", image_width, image_height, viewport_width, viewport_height); - let viewport_u = Vec3::new(viewport_width, 0.0, 0.0); - // image x--> right - // | - // y - // space: y up , x right , z back, -z front - let viewport_v = Vec3::new(0.0, -viewport_height, 0.0); - - // width per pix - let viewport_u_delta = viewport_u / (image_width as f32); - // height per pix - let viewport_v_delta = viewport_v / (image_height as f32); - - // camerea position - let camera_center = Point::new(0.0, 0.0, 0.0); - // -z 1.0 viewport to camera - let focal_length = Vec3::new(0.0, 0.0, -1.0); - // camera position --> viewport center ---> top center --> top left - let viewport_top_left_pixel = camera_center + focal_length - viewport_u / 2.0 - viewport_v / 2.0; - // padding 0.5* delta u/v - let viewport_top_left_pixel_center = viewport_top_left_pixel - viewport_u_delta / 2.0 - viewport_v_delta / 2.0; - - let ppm_content = gen_ray_sphere_ppm_p3(image_width, image_height, camera_center, viewport_top_left_pixel_center, viewport_u_delta, viewport_v_delta); - - write_image(ppm_content, "./target/ray_sphere_scene_render.ppm".to_string()) -} - - -fn ray_scene_render() { - let aspect_ratio = 16.0/9.0; - let image_width = 400; - // aleast 1px - let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1); - - let viewport_height = 2.0; - let viewport_width = viewport_height * (image_width as f32 / image_height as f32); - - println!("set image({},{}), viewport({},{})", image_width, image_height, viewport_width, viewport_height); - let viewport_u = Vec3::new(viewport_width, 0.0, 0.0); - // image x--> right - // | - // y - // space: y up , x right , z back, -z front - let viewport_v = Vec3::new(0.0, -viewport_height, 0.0); - - // width per pix - let viewport_u_delta = viewport_u / (image_width as f32); - // height per pix - let viewport_v_delta = viewport_v / (image_height as f32); - - // camerea position - let camera_center = Point::new(0.0, 0.0, 0.0); - // -z 1.0 viewport to camera - let focal_length = Vec3::new(0.0, 0.0, -1.0); - // camera position --> viewport center ---> top center --> top left - let viewport_top_left_pixel = camera_center + focal_length - viewport_u / 2.0 - viewport_v / 2.0; - // padding 0.5* delta u/v - let viewport_top_left_pixel_center = viewport_top_left_pixel - viewport_u_delta / 2.0 - viewport_v_delta / 2.0; - - let ppm_content = gen_ray_ppm_p3(image_width, image_height, camera_center, viewport_top_left_pixel_center, viewport_u_delta, viewport_v_delta); - - write_image(ppm_content, "./target/ray_scene_render.ppm".to_string()) -} - - -fn gen_gradient_ppm() { - let ppm_content = gen_gradient_ppm_p3(400, 225); - - let v1 = Vec3::new(1.0, 1.0, 1.0); - let v2 = Vec3::new(1.0, 1.0, 1.0); - - println!("v: {:#} + {:#} => {:#}", v1, v2, v1 + v2); - println!("v: {:#} + {:#} => {:#}", v1, v2, v1 - v2); - println!("v: {:#} + {:#} => {:#}", v1, v2, v1.dot(v2)); - println!("v: {:#} + {:#} => {:#}", v1, v2, v1.cross(v2)); - println!("color: {:#}", Color::new(0.3, 0.4, 1.0).to_color()); - println!("point: {:#}", Point::new(1.0, 1.0, 1.0)); - let ray = Ray::new(Point::new(1.0, 1.0, 1.0), Vec3 { x: 0.0, y: 1.0, z: 0.0 }); - println!("Ray: {:#} => {:#}", ray, ray.at(2.0)); - - write_image(ppm_content, "./target/gen_gradient_ppm.ppm".to_string()) } \ No newline at end of file