/// <summary>
        /// 检测当前平截头体与指定的平截头体是否相交
        /// </summary>
        /// <param name="frustum">要检测的平截头体</param>
        /// <returns>如果相交,返回true,否则,返回false</returns>
        public bool Intersects(BoundingFrustum frustum)
        {
            Vector3 closestPoint;

            if (frustum == null)
            {
                throw new ArgumentNullException("frustum");
            }
            if (this.gjk == null)
            {
                this.gjk = new Gjk();
            }
            this.gjk.Reset();
            Vector3.Sub(ref this.cornerArray[0], ref frustum.cornerArray[0], out closestPoint);
            if (closestPoint.LengthSquared() < 1E-05f)
            {
                Vector3.Sub(ref this.cornerArray[0], ref frustum.cornerArray[1], out closestPoint);
            }
            float maxValue = float.MaxValue;
            float num3     = 0f;

            do
            {
                Vector3 vector2;
                Vector3 vector3;
                Vector3 vector4;
                Vector3 vector5;
                vector5.X = -closestPoint.X;
                vector5.Y = -closestPoint.Y;
                vector5.Z = -closestPoint.Z;
                this.SupportMapping(ref vector5, out vector4);
                frustum.SupportMapping(ref closestPoint, out vector3);
                Vector3.Sub(ref vector4, ref vector3, out vector2);
                float num4 = ((closestPoint.X * vector2.X) + (closestPoint.Y * vector2.Y)) + (closestPoint.Z * vector2.Z);
                if (num4 > 0f)
                {
                    return(false);
                }
                this.gjk.AddSupportPoint(ref vector2);
                closestPoint = this.gjk.ClosestPoint;
                float num2 = maxValue;
                maxValue = closestPoint.LengthSquared();
                num3     = 4E-05f * this.gjk.MaxLengthSquared;
                if ((num2 - maxValue) <= (1E-05f * num2))
                {
                    return(false);
                }
            }while (!this.gjk.FullSimplex && (maxValue >= num3));
            return(true);
        }
        /// <summary>
        /// 检测当前平截头体是否与指定的包围球相交
        /// </summary>
        /// <param name="box">要检测的包围球</param>
        /// <param name="result">[输出参数] 如果相交,返回true,否则,返回false</param>
        public void Intersects(ref BoundingSphere sphere, out bool result)
        {
            Vector3 unitX;
            Vector3 vector2;
            Vector3 vector3;
            Vector3 vector4;
            Vector3 vector5;

            if (this.gjk == null)
            {
                this.gjk = new Gjk();
            }
            this.gjk.Reset();
            Vector3.Sub(ref this.cornerArray[0], ref sphere.Center, out unitX);
            if (unitX.LengthSquared() < 1E-05f)
            {
                unitX = Vector3.UnitX;
            }
            float maxValue = float.MaxValue;
            float num3     = 0f;

            result = false;
Label_005A:
            vector5.X = -unitX.X;
            vector5.Y = -unitX.Y;
            vector5.Z = -unitX.Z;
            this.SupportMapping(ref vector5, out vector4);
            sphere.SupportMapping(ref unitX, out vector3);
            Vector3.Sub(ref vector4, ref vector3, out vector2);
            float num4 = ((unitX.X * vector2.X) + (unitX.Y * vector2.Y)) + (unitX.Z * vector2.Z);

            if (num4 <= 0f)
            {
                this.gjk.AddSupportPoint(ref vector2);
                unitX = this.gjk.ClosestPoint;
                float num2 = maxValue;
                maxValue = unitX.LengthSquared();
                if ((num2 - maxValue) > (1E-05f * num2))
                {
                    num3 = 4E-05f * this.gjk.MaxLengthSquared;
                    if (!this.gjk.FullSimplex && (maxValue >= num3))
                    {
                        goto Label_005A;
                    }
                    result = true;
                }
            }
        }
        /// <summary>
        /// 检测当前平截头体是否与指定的包围盒相交
        /// </summary>
        /// <param name="box">要检测的包围盒</param>
        /// <param name="result">[输出参数] 如果相交,返回true,否则,返回false</param>
        public void Intersects(ref BoundingBox box, out bool result)
        {
            Vector3 closestPoint;
            Vector3 vector2;
            Vector3 vector3;
            Vector3 vector4;
            Vector3 vector5;

            if (this.gjk == null)
            {
                this.gjk = new Gjk();
            }
            this.gjk.Reset();
            Vector3.Sub(ref this.cornerArray[0], ref box.Min, out closestPoint);
            if (closestPoint.LengthSquared() < 1E-05f)
            {
                Vector3.Sub(ref this.cornerArray[0], ref box.Max, out closestPoint);
            }
            float maxValue = float.MaxValue;
            float num3     = 0f;

            result = false;
Label_006D:
            vector5.X = -closestPoint.X;
            vector5.Y = -closestPoint.Y;
            vector5.Z = -closestPoint.Z;
            this.SupportMapping(ref vector5, out vector4);
            box.SupportMapping(ref closestPoint, out vector3);
            Vector3.Sub(ref vector4, ref vector3, out vector2);
            float num4 = ((closestPoint.X * vector2.X) + (closestPoint.Y * vector2.Y)) + (closestPoint.Z * vector2.Z);

            if (num4 <= 0f)
            {
                this.gjk.AddSupportPoint(ref vector2);
                closestPoint = this.gjk.ClosestPoint;
                float num2 = maxValue;
                maxValue = closestPoint.LengthSquared();
                if ((num2 - maxValue) > (1E-05f * num2))
                {
                    num3 = 4E-05f * this.gjk.MaxLengthSquared;
                    if (!this.gjk.FullSimplex && (maxValue >= num3))
                    {
                        goto Label_006D;
                    }
                    result = true;
                }
            }
        }