code clean

This commit is contained in:
dengqn 2025-08-03 00:17:15 +08:00
parent 3d835bcf63
commit b89ad6932d
2 changed files with 1 additions and 239 deletions

View File

@ -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 = 01< 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
}

View File

@ -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())
}