#include "Sphere.h" #include "util/Solver.h" #include #include using namespace std; Sphere::Sphere(double radius) { m_radius = radius; m_radius2 = radius * radius; } Shape::IntersectionList Sphere::intersect(refptr _this, const Ray & ray) { Ray ray_inv = m_inverse.transform_ray(ray); IntersectionList res; QuadraticSolver solver(1.0, 2 * ( ray_inv.getOrigin()[0] * ray_inv.getDirection()[0] + ray_inv.getOrigin()[1] * ray_inv.getDirection()[1] + ray_inv.getOrigin()[2] * ray_inv.getDirection()[2] ), ray_inv.getOrigin()[0] * ray_inv.getOrigin()[0] + ray_inv.getOrigin()[1] * ray_inv.getOrigin()[1] + ray_inv.getOrigin()[2] * ray_inv.getOrigin()[2] - m_radius2); Solver::Result quadSolutions = solver.solve(); for (int i = 0; i < quadSolutions.numResults; i++) { if (quadSolutions.results[i] >= 0.0) { Vector isect_point = ray_inv[quadSolutions.results[i]]; Vector normal = isect_point; normal.normalize(); res.add( Intersection(_this, m_transform.transform_point(isect_point), m_transform.transform_normal(normal)) ); } } return res; } refptr Sphere::clone() { return new Sphere(*this); }