public static bool PointToBox(System.Numerics.Vector2 point, Box box, out CollisionResult result) { result = new CollisionResult(); if (box.ContainsPoint(point)) { // get the point in the space of the Box result.Point = box.bounds.GetClosestPointOnRectangleBorderToPoint(point, out result.Normal); result.MinimumTranslationVector = point - result.Point; return(true); } return(false); }
/// <summary> /// works for circles whos center is in the box as well as just overlapping with the center out of the box. /// </summary> /// <returns><c>true</c>, if to box was circled, <c>false</c> otherwise.</returns> /// <param name="circle">First.</param> /// <param name="box">Second.</param> /// <param name="result">Result.</param> public static bool CircleToBox(Circle circle, Box box, out CollisionResult result) { result = new CollisionResult(); var closestPointOnBounds = box.bounds.GetClosestPointOnRectangleBorderToPoint(circle.position, out result.Normal); // deal with circles whos center is in the box first since its cheaper to see if we are contained if (box.ContainsPoint(circle.position)) { result.Point = closestPointOnBounds; // calculate mtv. Find the safe, non-collided position and get the mtv from that. var safePlace = closestPointOnBounds + result.Normal * circle.Radius; result.MinimumTranslationVector = circle.position - safePlace; return(true); } float sqrDistance; Vector2.DistanceSquared(ref closestPointOnBounds, ref circle.position, out sqrDistance); // see if the point on the box is less than radius from the circle if (sqrDistance == 0) { result.MinimumTranslationVector = result.Normal * circle.Radius; } else if (sqrDistance <= circle.Radius * circle.Radius) { result.Normal = circle.position - closestPointOnBounds; var depth = result.Normal.Length() - circle.Radius; result.Point = closestPointOnBounds; Vector2Ext.Normalize(ref result.Normal); result.MinimumTranslationVector = depth * result.Normal; return(true); } return(false); }