C# 求线段与圆的交点

来源:互联网 发布:网络系统集成技术 编辑:程序博客网 时间:2024/06/07 13:24

本文转自:http://blog.csdn.net/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;            }        }