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;
}