/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* maths_cone.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 20:02:35 by gbrochar #+# #+# */ /* Updated: 2019/02/22 17:26:00 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "rtv1.h" double intersect_cone(void *obj, t_ray r) { t_cone *co; t_vec sub_ori; double params[3]; double roots[2]; co = (t_cone *)obj; sub_ori = vec_sub(r.o, co->o); params[0] = dot_product(r.d, r.d) - (pow(co->k, 2) + (double)1) * pow(dot_product(r.d, co->d), 2); params[1] = (double)2 * (dot_product(r.d, sub_ori) - (pow(co->k, 2) + (double)1) * dot_product(r.d, co->d) * dot_product(sub_ori, co->d)); params[2] = dot_product(sub_ori, sub_ori) - (pow(co->k, 2) + (double)1) * pow(dot_product(sub_ori, co->d), 2); 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_cone(void *obj, t_ray r, double t) { t_cone *co; t_vec p; double m; co = (t_cone *)obj; p = vec_add(r.o, vec_mul(r.d, t)); m = dot_product(r.d, co->d) * t + dot_product(vec_sub(r.o, co->o), co->d); p = vec_sub(vec_sub(vec_sub(p, co->o), vec_mul(co->d, m)), vec_mul(co->d, m * pow(co->k, 2))); normalize(&p); return (p); }