/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* maths_sphere.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 14:43:58 by gbrochar #+# #+# */ /* Updated: 2019/02/11 14:15:57 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "rtv1.h" double intersect_sphere(void *obj, t_ray r) { t_sphere *s; double roots[2]; double params[3]; s = (t_sphere *)obj; params[0] = 1; params[1] = (double)2 * dot_product(r.d, vec_sub(r.o, s->o)); params[2] = dot_product(vec_sub(r.o, s->o), vec_sub(r.o, s->o)) - s->r * s->r; if (SUCCESS == solve_quadratic(params, roots)) { if (roots[0] > 0) return (roots[0] - E); else if (roots[1] > 0) return (roots[1] - E); } return (FAILURE); } t_vec normal_sphere(void *obj, t_ray r, double t) { t_sphere *s; t_vec p; s = (t_sphere *)obj; p = vec_add(r.o, vec_mul(r.d, t)); p = vec_sub(p, s->o); normalize(&p); return (p); }