#include "structs.h" #include "math.h" #include "helper.h" vec3 collisionPointSphere(ray *lightray, sphere *object) { vec3 collisionPoint; collisionPoint.x = -10000000; collisionPoint.y = -10000000; collisionPoint.z = -10000000; double a = lightray->direction.x * lightray->direction.x + lightray->direction.y * lightray->direction.y + lightray->direction.z * lightray->direction.z; double b = 2 * ((lightray->direction.x * (lightray->origin.x - object->origin.x)) + (lightray->direction.y * (lightray->origin.y - object->origin.y)) + (lightray->direction.z * (lightray->origin.z - object->origin.z))); double c = (lightray->origin.x * lightray->origin.x + object->origin.x * object->origin.x - 2 * lightray->origin.x * object->origin.x) + (lightray->origin.y * lightray->origin.y + object->origin.y * object->origin.y - 2 * lightray->origin.y * object->origin.y) + (lightray->origin.z * lightray->origin.z + object->origin.z * object->origin.z - 2 * lightray->origin.z * object->origin.z) - object->radius * object->radius; double discriminant = b * b - 4 * a * c; if (discriminant < 0) return collisionPoint; if (discriminant > 0) { double S = (-b - sqrt(discriminant)) / (2 * a); if (S < 0) return collisionPoint; collisionPoint.x = S * lightray->direction.x + lightray->origin.x; collisionPoint.y = S * lightray->direction.y + lightray->origin.y; collisionPoint.z = S * lightray->direction.z + lightray->origin.z; if (!epsilonCheck(lightray->origin, collisionPoint)) { return (vec3){-10000000, -10000000, -10000000}; } return collisionPoint; } double S = (-b)/(2*a); if (S < 0) return collisionPoint; collisionPoint.x = S * lightray->direction.x + lightray->origin.x; collisionPoint.y = S * lightray->direction.y + lightray->origin.y; collisionPoint.z = S * lightray->direction.z + lightray->origin.z; return collisionPoint; }