18 const Point & p0 = line_segment.
start();
19 const Point & p1 = line_segment.
end();
20 const Point d = p1 - p0;
21 const Point f = p0 -
_c;
23 const Real a = d.norm_sq();
24 const Real b = 2.0 * (f * d);
25 const Real c = f.norm_sq() -
_r *
_r;
28 return f.norm_sq() <=
_r *
_r;
30 const Real discriminant = b * b - 4.0 * a * c;
31 if (discriminant < 0.0)
34 const Real sqrt_disc = std::sqrt(discriminant);
35 const Real inv_denom = 1.0 / (2.0 * a);
36 const Real t1 = (-b - sqrt_disc) * inv_denom;
37 const Real t2 = (-b + sqrt_disc) * inv_denom;
39 return (t1 >= 0.0 && t1 <= 1.0) || (t2 >= 0.0 && t2 <= 1.0);