首页 > 其他分享 >0197-封装相机逻辑

0197-封装相机逻辑

时间:2024-07-19 14:44:37浏览次数:13  
标签:封装 0.0 相机 let new 1.0 f64 0197 ray

环境

  • Time 2022-11-16
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html

目标

重构相机部分逻辑,将其单独提到一个类中,保持逻辑不变。

camera.rs

use super::ray::Ray;
use super::vector3::{Point3, Vector3};

pub struct Camera {
    origin: Point3,
    corner: Point3,
    horizontal: Vector3,
    vertical: Vector3,
}

pub const RATIO: f64 = 16.0 / 9.0;
const HEIGHT: f64 = 2.0;
const WIDTH: f64 = RATIO * HEIGHT;
const FOCAL: f64 = 1.0;

impl Camera {
    pub fn new() -> Camera {
        let origin = Point3::new(0.0, 0.0, 0.0);
        let horizontal = Vector3::new(WIDTH, 0.0, 0.0);
        let vertical = Vector3::new(0.0, HEIGHT, 0.0);
        let center = origin - horizontal / 2.0 - vertical / 2.0;
        let corner = center - Vector3::new(0.0, 0.0, FOCAL);

        Camera {
            origin,
            horizontal,
            vertical,
            corner,
        }
    }

    pub fn get_ray(&self, u: f64, v: f64) -> Ray {
        let vector3 = self.corner + u * self.horizontal + v * self.vertical;
        Ray {
            origin: self.origin,
            direction: vector3 - self.origin,
        }
    }
}

main.rs

use camera::Camera;
use hittable::{Hit, World};
use ray::Ray;
use sphere::Sphere;
use vector3::{Color, Point3};

mod camera;
mod hittable;
mod ray;
mod sphere;
mod vector3;

fn main() {
    // 图片的比例,和宽高
    const WIDTH: u64 = 400;
    const HEIGHT: u64 = (WIDTH as f64 / camera::RATIO) as u64;

    // 相机
    let camera = Camera::new();

    // 输出图片,第一行输出 P3,表示像素图
    let mut content = String::from("P3");
    // 输出宽和高,和最大颜色值
    content.push_str(&format!("\n{WIDTH} {HEIGHT}\n255\n"));

    let world: World = vec![
        Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5)),
        Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0)),
    ];

    for j in (0..HEIGHT).rev() {
        // 进度
        eprintln!("Scan lines remaining: {j}");
        for i in 0..WIDTH {
            let u = i as f64 / (WIDTH - 1) as f64;
            let v = j as f64 / (HEIGHT - 1) as f64;

            let color = ray_color(&camera.get_ray(u, v), &world);
            content.push_str(&color.format_str());
        }
    }
    println!("{}", content);
    eprintln!("Done.");
}

// 光线的颜色计算
fn ray_color(ray: &Ray, hittable: &dyn Hit) -> Color {
    let option = hittable.hit(ray, 0.0, f64::INFINITY);

    if let Some(record) = option {
        return 0.5 * (record.normal + Color::new(1.0, 1.0, 1.0));
    }

    // 射线的单位向量
    let unit = ray.direction().unit();
    // 因为需要得到上下渐变的背景图,所以需要对 y 进行插值。
    let t = 0.5 * (unit.y + 1.0);
    // 线性插值,根据不同的光线得到在下面这个范围里的不同的颜色,并且是渐变色。
    (1.0 - t) * Color::new(1.0, 1.0, 1.0) + t * Color::new(0.5, 0.7, 1.0)
}

总结

将相机的逻辑独立到一个单独的文件中,减少了主函数的逻辑。

附录

标签:封装,0.0,相机,let,new,1.0,f64,0197,ray
From: https://www.cnblogs.com/jiangbo4444/p/18311409

相关文章

  • 前端WebSocket的方法封装
    一、封装方法在项目根目录src下的utils中新增webSocketManager.js封装文件,代码内容如下://webSocketManager.js/**WebSocketMessenger封装类*/classWebSocketManager{constructor(url=null,userId=null,receiveMessageCallback=null){this.socket=nul......
  • 重生归来,从 996福报 到 N+1告别职场【如何封装一个支持图片和PDF在线预览的Vue组件】
    如何封装一个支持图片和PDF在线预览的Vue组件在本文中,我将介绍如何设计并实现一个Vue组件,该组件能够在线预览图片和PDF文件。我们将基于element-ui的elImageViewer组件进行改造,并使用vue-pdf插件来实现PDF预览功能。本文将详细介绍从设计思路到落地实现的全过程,完整代码在......
  • Airtest封装的Tidevice接口有多好用(一)
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言很多同学都有在Windows电脑上连接本地iOS设备去进行测试的需求,其中tidevice库是大家在Windows上使用的最多的iOS通信库,其中有一些接口是我们比较常用的,所......
  • 使用ElementUI和element-china-area-data库实现省市区三级联动组件封装
    使用ElementUI和element-china-area-data库实现省市区三级联动组件封装在前端开发中,省市区三级联动是一个常见的需求。今天我们将使用Vue.js和ElementUI组件库,结合element-china-area-data库,来实现一个省市区三级联动的组件。这个组件不仅可以提高用户体验,还能大大简化我们的代码......
  • 二次封装antd的ProTable、EditableProTable,结合use-antd-resizable-header,做一个列可
    原先是一个项目模块内需求,迭代的时候领导要求项目全面翻新,所有表格都要可伸缩列如果一个一个页面写伸缩列的话,每个页面都要引用一次use-antd-resizable-header,有点累赘找了网上,暂时没看见这个有人整理这个组件。直接上代码importProTablefrom"@ant-design/pro-table";i......
  • cookie方法封装
    方法封装:/***获取cookie*/exportfunctiongetCookie(sKey:string):string{if(!sKey){returnnull;}returndecodeURIComponent(document.cookie.replace(newRegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(sKey).replace(/[\-\.\+\*]/g,......
  • HTTP协议——请求封装
    请求封装在我们使用请求的使用避免不了多次请求,这样代码的重复率就会变高,我们可以将请求进行封装进而调用,不仅提高了代码的重用性也提高了代码的质量封装  internalclassHttp  {    ///<summary>    ///请求类型    ///</summary>......
  • LM2733YMF/NOPB 封装 SOT23-5 丝印S52B DC-DC电源芯片
    LM2733YMF/NOPB规格信息:制造商:TexasInstruments产品种类:开关稳压器RoHS:是安装风格:SMD/SMT封装/箱体:SOT-23-5输出电压:3Vto40V输出电流:1.5A输出端数量:1Output最大输入电压:14V拓扑结构:Boost开关频率:600kHz最小工作温度:-40C最大工作温度:+......
  • 【相机标定】标定板介绍以及优缺点分析
    【相机标定】标定板介绍以及优缺点分析背景介绍附赠自动驾驶最全的学习资料和量产经验:链接准确标定像机对于所有的机器/计算机视觉的成功应用都是非常重要的。然而,对于标定板,有不同的模式可供选择。为了方便进行选择,本文将解释每种方法的主要好处。标定板的选择,有Charu......
  • 多相机视觉系统的坐标系统标定与统一及其应用
    多相机视觉系统的坐标系统标定与统一及其应用导语:随着机器视觉应用的日益广泛,大幅面 多相机 视觉系统的需求越来越多,主要应用方向为大幅面高精度的定位与测量和场景拼接等。多相机视觉系统的难点在于多相机坐标系的统一. 可以分为两类,一是相机视野间无重叠部分,二是相......