args = solve_quadratic(vec_scalar_mul(v, v), 2 * vec_scalar_mul(v, u),
vec_scalar_mul(u, u) - cylinder->radius * cylinder->radius);
intersect = ray_point(ray, args.first);
- if (fabs(vec_scalar_mul(cylinder->rot_axis, intersect)) < cylinder->height / 2
- && vec_scalar_mul(ray->direction, vec_diff(cylinder->center, intersect)) > 0)
+ if (fabs(vec_scalar_mul(cylinder->rot_axis, vec_diff(intersect, cylinder->center))) < cylinder->height / 2
+ && vec_scalar_mul(vec_vec_mul(cylinder->rot_axis, ray->direction), vec_vec_mul(cylinder->rot_axis, vec_diff(cylinder->center, intersect))) > 0)
return (args.first);
intersect = ray_point(ray, args.second);
- if (fabs(vec_scalar_mul(cylinder->rot_axis, intersect)) < cylinder->height / 2
- && vec_scalar_mul(ray->direction, vec_diff(cylinder->center, intersect)) > 0)
+ if (fabs(vec_scalar_mul(cylinder->rot_axis, vec_diff(intersect, cylinder->center))) < cylinder->height / 2
+ && vec_scalar_mul(vec_vec_mul(cylinder->rot_axis, ray->direction), vec_vec_mul(cylinder->rot_axis, vec_diff(cylinder->center, intersect))) > 0)
return (args.second);
return (NAN);
}
double res;
res = get_intersection_arg_cylinder_base(ray, cylinder);
- if (res == NAN)
+ if (isnan(res))
res = get_intersection_arg_cylinder_around(ray, cylinder);
return (res);
}