#include "Sphere.h" #include "util/Solver.h" #include using namespace std; Sphere::Sphere(double radius) { m_radius = radius; m_radius2 = radius * radius; } Solver::Result Sphere::intersect(const Ray & ray) { Solver::Result res; QuadraticSolver solver(1.0, 2 * ( ray.getOrigin()[0] * ray.getDirection()[0] + ray.getOrigin()[1] * ray.getDirection()[1] + ray.getOrigin()[2] * ray.getDirection()[2] ), ray.getOrigin()[0] * ray.getOrigin()[0] + ray.getOrigin()[1] * ray.getOrigin()[1] + ray.getOrigin()[2] * ray.getOrigin()[2] - m_radius2); Solver::Result quadSolutions = solver.solve(); int resIdx = 0; for (int i = 0; i < quadSolutions.numResults; i++) { if (quadSolutions.results[i] >= 0.0) { res.results[resIdx] = quadSolutions.results[i]; resIdx++; res.numResults = resIdx; } } return res; }