/* Calculate the intersection of a ray and a sphere The line segment is defined from p1 to p2 The sphere is of radius r and centered at sc There are potentially two points of intersection given by p = p1 + mu1 (p2 - p1) p = p1 + mu2 (p2 - p1) Return FALSE if the ray doesn't intersect the sphere. */ int RaySphere(XYZ p1,XYZ p2,XYZ sc,double r,double *mu1,double *mu2) { double a,b,c; double bb4ac; XYZ dp; dp.x = p2.x - p1.x; dp.y = p2.y - p1.y; dp.z = p2.z - p1.z; a = dp.x * dp.x + dp.y * dp.y + dp.z * dp.z; b = 2 * (dp.x * (p1.x - sc.x) + dp.y * (p1.y - sc.y) + dp.z * (p1.z - sc.z)); c = sc.x * sc.x + sc.y * sc.y + sc.z * sc.z; c += p1.x * p1.x + p1.y * p1.y + p1.z * p1.z; c -= 2 * (sc.x * p1.x + sc.y * p1.y + sc.z * p1.z); c -= r * r; bb4ac = b * b - 4 * a * c; if (ABS(a) < EPS || bb4ac < 0) { *mu1 = 0; *mu2 = 0; return(FALSE); } *mu1 = (-b + sqrt(bb4ac)) / (2 * a); *mu2 = (-b - sqrt(bb4ac)) / (2 * a); return(TRUE); }