Chapter 6: Antialiasing
This commit is contained in:
46
code/sphere.h
Normal file
46
code/sphere.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef SPHERE_H
|
||||
#define SPHERE_H
|
||||
|
||||
#include "target.h"
|
||||
|
||||
class sphere: public target
|
||||
{
|
||||
public:
|
||||
sphere() {};
|
||||
sphere(vec3 cen, float r) : center(cen), radius(r) {};
|
||||
virtual bool hit(const ray &r, float t_min, float t_max, hit_record &rec) const;
|
||||
vec3 center;
|
||||
float radius;
|
||||
};
|
||||
|
||||
bool sphere::hit(const ray &r, float t_min, float t_max, hit_record &rec) const
|
||||
{
|
||||
vec3 oc = r.origin() - center;
|
||||
float a = dot(r.direction(), r.direction());
|
||||
float b = dot(oc, r.direction());
|
||||
float c = dot(oc, oc) - radius * radius;
|
||||
float discriminant = b * b - a * c;
|
||||
|
||||
if (discriminant > 0)
|
||||
{
|
||||
float temp = (-b - sqrt(discriminant)) / a;
|
||||
if (temp < t_max && temp > t_min)
|
||||
{
|
||||
rec.t = temp;
|
||||
rec.p = r.point_at_parameter(rec.t);
|
||||
rec.normal = (rec.p - center) / radius;
|
||||
return true;
|
||||
}
|
||||
temp = (-b + sqrt(discriminant)) / a;
|
||||
if (temp < t_max && temp > t_min)
|
||||
{
|
||||
rec.t = temp;
|
||||
rec.p = r.point_at_parameter(rec.t);
|
||||
rec.normal = (rec.p - center) / radius;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user