TerrainDisplay.Collision.Intersection.IntersectSegmentCylinder C# (CSharp) Method

IntersectSegmentCylinder() public static method

public static IntersectSegmentCylinder ( System.Vector3 sa, System.Vector3 sb, System.Vector3 p, System.Vector3 q, float r, float &t ) : bool
sa System.Vector3
sb System.Vector3
p System.Vector3
q System.Vector3
r float
t float
return bool
        public static bool IntersectSegmentCylinder(Vector3 sa, Vector3 sb, Vector3 p, Vector3 q, float r, ref float t)
        {
            var vector = q - p;
            var vector2 = sa - p;
            var vector3 = sb - sa;
            var num = Vector3.Dot(vector2, vector);
            var num2 = Vector3.Dot(vector3, vector);
            var num3 = Vector3.Dot(vector, vector);
            if ((num >= 0f) || ((num + num2) >= 0f))
            {
                if ((num > num3) && ((num + num2) > num3))
                {
                    return false;
                }
                var num4 = Vector3.Dot(vector3, vector3);
                var num5 = Vector3.Dot(vector2, vector3);
                var num6 = (num3 * num4) - (num2 * num2);
                var num7 = Vector3.Dot(vector2, vector2) - (r * r);
                var num8 = (num3 * num7) - (num * num);
                if (num6 < 0.0001f)
                {
                    if (num8 > 0f)
                    {
                        return false;
                    }
                    if (num < 0f)
                    {
                        t = -num5 / num4;
                    }
                    else if (num > num3)
                    {
                        t = (num2 - num5) / num4;
                    }
                    else
                    {
                        t = 0f;
                    }
                    return true;
                }
                var num9 = (num3 * num5) - (num2 * num);
                var num10 = (num9 * num9) - (num6 * num8);
                if (num10 >= 0f)
                {
                    t = (-num9 - ((float)Math.Sqrt(num10))) / num6;
                    if ((t < 0f) || (t > 1f))
                    {
                        return false;
                    }
                    if ((num + (t * num2)) < 0f)
                    {
                        if (num2 <= 0f)
                        {
                            return false;
                        }
                        t = -num / num2;
                        return ((num7 + ((2f * t) * (num5 + (t * num4)))) <= 0f);
                    }
                    if ((num + (t * num2)) > num3)
                    {
                        if (num2 >= 0f)
                        {
                            return false;
                        }
                        t = (num3 - num) / num2;
                        return ((((num7 + num3) - (2f * num)) + (t * ((2f * (num5 - num2)) + (t * num4)))) <= 0f);
                    }
                }
            }
            return false;
        }