这一节比较简单,就是将上一节的 hit_sphere 函数进行一定的简化,直接看代码。代码中简化之前的已经注释,可以直接对比一下,不同的计算方式,最终算出来的值都是一样的。

fn hit_sphere(center: Vec3, radius: f64, r: Ray) -> f64 {
    // 公式中的 (A - C)
    let oc = r.origin - center;

    // 公式中第1项的 b*b
    // let a = Vec3::dot(r.direction, r.direction);
    let a = r.direction.length_squared();

    // 公式中第2项的内容,忽略 t
    // let b = 2.0 * Vec3::dot(oc, r.direction);
    let half_b = Vec3::dot(oc, r.direction);

    // 公式中的 (A - C) * (A - C) - r^2
    // let c = Vec3::dot(oc, oc) - radius * radius;
    let c = oc.length_squared() - radius * radius;

    // 计算出了 a, b, c,判断 b^2 - 4ac 解的个数
    // let result = b * b - 4.0 * a * c;
    let result = half_b * half_b - a * c;

    if result < 0.0 {
        return -1.0;
    } else {
        // return (-b - result.sqrt()) / (2.0 * a);
        return (-half_b - result.sqrt()) / a;
    }
}