/// <summary> /// Checks whether the current BoundingFrustumD intersects a BoundingSphere. /// </summary> /// <param name="sphere">The BoundingSphere to check for intersection with.</param><param name="result">[OutAttribute] true if the BoundingFrustumD and BoundingSphere intersect; false otherwise.</param> public void Intersects(ref BoundingSphereD sphere, out bool result) { if (this.gjk == null) { this.gjk = new GjkD(); } this.gjk.Reset(); Vector3D result1; Vector3D.Subtract(ref this.cornerArray[0], ref sphere.Center, out result1); if ((double)result1.LengthSquared() < 9.99999974737875E-06) { result1 = Vector3D.UnitX; } double num1 = double.MaxValue; result = false; double num2; do { Vector3D v; v.X = -result1.X; v.Y = -result1.Y; v.Z = -result1.Z; Vector3D result2; this.SupportMapping(ref v, out result2); Vector3D result3; sphere.SupportMapping(ref result1, out result3); Vector3D result4; Vector3D.Subtract(ref result2, ref result3, out result4); if ((double)result1.X * (double)result4.X + (double)result1.Y * (double)result4.Y + (double)result1.Z * (double)result4.Z > 0.0) { return; } this.gjk.AddSupportPoint(ref result4); result1 = this.gjk.ClosestPoint; double num3 = num1; num1 = result1.LengthSquared(); if ((double)num3 - (double)num1 <= 9.99999974737875E-06 * (double)num3) { return; } num2 = 4E-05f * this.gjk.MaxLengthSquared; }while (!this.gjk.FullSimplex && (double)num1 >= (double)num2); result = true; }
public void Intersects(ref BoundingSphereD sphere, out bool result) { Vector3D unitX; Vector3D vectord2; Vector3D vectord3; Vector3D vectord4; Vector3D vectord5; if (this.gjk == null) { this.gjk = new GjkD(); } this.gjk.Reset(); Vector3D.Subtract(ref this.cornerArray[0], ref sphere.Center, out unitX); if (unitX.LengthSquared() < 9.99999974737875E-06) { unitX = Vector3D.UnitX; } double maxValue = double.MaxValue; result = false; Label_005D: vectord2.X = -unitX.X; vectord2.Y = -unitX.Y; vectord2.Z = -unitX.Z; this.SupportMapping(ref vectord2, out vectord3); sphere.SupportMapping(ref unitX, out vectord4); Vector3D.Subtract(ref vectord3, ref vectord4, out vectord5); if ((((unitX.X * vectord5.X) + (unitX.Y * vectord5.Y)) + (unitX.Z * vectord5.Z)) <= 0.0) { this.gjk.AddSupportPoint(ref vectord5); unitX = this.gjk.ClosestPoint; double num3 = maxValue; maxValue = unitX.LengthSquared(); if ((num3 - maxValue) > (9.99999974737875E-06 * num3)) { double num2 = 3.9999998989515007E-05 * this.gjk.MaxLengthSquared; if (!this.gjk.FullSimplex && (maxValue >= num2)) { goto Label_005D; } result = true; } } }