本文转自:http://blog.youkuaiyun.com/rabbit729/article/details/4285119
原文给出了很好的思路
/// <summary>
/// 线段与圆的交点
/// </summary>
/// <param name="ptStart">线段起点</param>
/// <param name="ptEnd">线段终点</param>
/// <param name="ptCenter">圆心坐标</param>
/// <param name="Radius2">圆半径平方</param>
/// <param name="ptInter1">交点1(若不存在返回65536)</param>
/// <param name="ptInter2">交点2(若不存在返回65536)</param>
protected bool LineInterCircle(Point ptStart, Point ptEnd, Point ptCenter, double Radius2,
ref PointF ptInter1, ref PointF ptInter2)
{
ptInter1.X = ptInter2.X = 65536.0f;
ptInter2.Y = ptInter2.Y = 65536.0f;
float fDis = (float)Math.Sqrt((ptEnd.X - ptStart.X) * (ptEnd.X - ptStart.X) + (ptEnd.Y - ptStart.Y) * (ptEnd.Y - ptStart.Y));
PointF d = new PointF();
d.X = (ptEnd.X - ptStart.X) / fDis;
d.Y = (ptEnd.Y - ptStart.Y) / fDis;
PointF E = new PointF();
E.X = ptCenter.X - ptStart.X;
E.Y = ptCenter.Y - ptStart.Y;
float a = E.X * d.X + E.Y * d.Y;
float a2 = a * a;
float e2 = E.X * E.X + E.Y * E.Y;
if ((Radius2 - e2 + a2) < 0)
{
return false;
}
else
{
float f = (float)Math.Sqrt(Radius2 - e2 + a2);
float t = a - f;
if (((t - 0.0) > -EPS) && (t - fDis) < EPS)
{
ptInter1.X = ptStart.X + t * d.X;
ptInter1.Y = ptStart.Y + t * d.Y;
}
t = a + f;
if (((t - 0.0) > -EPS) && (t - fDis) < EPS)
{
ptInter2.X = ptStart.X + t * d.X;
ptInter2.Y = ptStart.Y + t * d.Y;
}
return true;
}
}