From 9e16d5f112a3aea7e15017da246e7944a85ead40 Mon Sep 17 00:00:00 2001 From: Faerbit Date: Wed, 3 Jun 2020 23:25:47 +0200 Subject: [PATCH] Implement sphere normals. --- wtracer.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/wtracer.cpp b/wtracer.cpp index 5f7e7c5..3783243 100644 --- a/wtracer.cpp +++ b/wtracer.cpp @@ -1,23 +1,32 @@ #include +#include #include "color.h" #include "vec3.h" #include "ray.h" -bool hit_sphere(const Point3& center, double radius, const Ray& r) { +double hit_sphere(const Point3& center, double radius, const Ray& r) { Vec3 oc = r.origin() - center; auto a = dot(r.direction(), r.direction()); auto b = 2.0 * dot(oc, r.direction()); auto c = dot(oc, oc) - radius * radius; auto disciminant = b*b - 4*a*c; - return disciminant > 0; + if (disciminant < 0) { + return -1.0; + } else { + return (-b - std::sqrt(disciminant)) / (2.0 * a); + } } Color ray_color(const Ray& r) { - if (hit_sphere(Point3(0, 0, -1), 0.5, r)) - return Color(1, 0, 0); + auto sphere_center = Point3(0, 0, -1); + auto t = hit_sphere(sphere_center, 0.5, r); + if (t > 0.0) { + Vec3 n = unit_vector(r.at(t) - sphere_center); + return 0.5 * Color(n.x()+1, n.y()+1, n.z()+1); + } Vec3 unit_direction = unit_vector(r.direction()); - auto t = 0.5 * (unit_direction.y() + 1.0); + t = 0.5 * (unit_direction.y() + 1.0); return (1.0 - t) * Color(1.0, 1.0, 1.0) + t * Color(0.5, 0.7, 1.0); }