计算线圆交点

基本思路是先求过圆心的直线的垂线,在判断点线距离和半径的大小来判断有没有交点,如果有交点,用与垂线的交点加上或减去弦长的一半乘以直线的方向向量。

       private static Vector2 CalIntersection(Vector2 start, Vector2 end, Vector2 center)
        {
            Vector2 v = Vector2.zero;

            float disY1 = end.y - start.y;
            float disX1 = end.x - start.x;

            //平行于x轴
            if (disY1.Approximately(0.0f))
            {
                v.x = center.x;
                v.y = start.y;
                return v;
            }

            //平行于y轴
            if (disX1.Approximately(0.0f))
            {
                v.x = start.x;
                v.y = center.y;
                return v;
            }

            float k1 = (end.y - start.y) / (end.x - start.x);
            float b1 = start.y - k1 * start.x;

            float k2 = 1.0f / -k1;

            float b2 = center.y - k2 * center.x;

            v.x = (b2 - b1) / (k1 - k2);
            v.y = k1 * v.x + b1;

            return v;
        }

        //弦长的一半
        private static float GetSpringLength(float radius, Vector2 center, Vector2 v1)
        {
            float a = 0;

            float lengthToCenter = (center - v1).sqrMagnitude;

            float sqrSpringLength = radius * radius - lengthToCenter;

            //无交点
            if (sqrSpringLength < 0)
            {
                return -1;
            }

            return (float) Math.Sqrt(sqrSpringLength);
        }

            Vector2 inter = CalIntersection(start.GetXZ(), end.GetXZ(), center.GetXZ());

            float length = GetSpringLength(radius, center.GetXZ(), inter);

            if (length < 0)
            {
                return end;
            }

            var nor = (end - start).normalized;

            var p = inter + (nor.GetXZ() * length);

你可能感兴趣的:(计算线圆交点)