public static bool EllipseOverlapSegment(
Vector2 K, double A, double B,
Vector2 P0, Vector2 P1)
{
// For the math, see:
// http://www.geometrictools.com/Documentation/IntersectionRectangleEllipse.pdf
double q0, q1, q2;
var Q0 = new Vector2((float)((P0.X - K.X) / A), (float)((P0.Y - K.Y) / B));
var Q1 = new Vector2((float)((P1.X - P0.X) / A), (float)((P1.X - P0.X) / B));
q0 = Vector2.Dot(Q0, Q0) - 1;
q1 = Vector2.Dot(Q0, Q1);
q2 = Vector2.Dot(Q1, Q1);
if (q2 == 0)
{
double d = -q0 / q1;
return 0 <= d && d <= 1;
}
double discr = q1 * q1 - q0 * q2;
if (discr < 0)
return false;
double sqrt_discr = System.Math.Sqrt(discr);
return (sqrt_discr - q1) >= 0 && (sqrt_discr + q1) >= -q2;
}