public static void Intersect(ref Rectanglef rect1, ref Rectanglef rect2, out Rectanglef result) { if (rect1.Contains(rect2)) result = new Rectanglef(rect2); else if (rect2.Contains(rect1)) result = new Rectanglef(rect1); else if (!rect1.Intersects(rect2)) result = new Rectanglef(); else { result = new Rectanglef( Math.Max(rect1.X, rect2.X), Math.Max(rect1.Y, rect2.Y), Math.Min(rect1.Right, rect2.Right) - Math.Max(rect1.Left, rect2.Left), Math.Min(rect1.Bottom, rect2.Bottom) - Math.Max(rect1.Top, rect2.Top)); } }
public static Rectanglef Intersect(Rectanglef rect1, Rectanglef rect2) { Rectanglef result; if (rect1.Contains(rect2)) result = new Rectanglef(rect2); else if (rect2.Contains(rect1)) result = new Rectanglef(rect1); else if (!rect1.Intersects(rect2)) result = new Rectanglef(); else { result = new Rectanglef( Math.Max(rect1.X, rect2.X), Math.Max(rect1.Y, rect2.Y), Math.Min(rect1.Right, rect2.Right) - Math.Max(rect1.Left, rect2.Left), Math.Min(rect1.Bottom, rect2.Bottom) - Math.Max(rect1.Top, rect2.Top)); } return result; }
/// <summary> /// Resolve inter penetration between two moveable objects /// </summary> /// <param name="overlap">Area of interpenetration</param> /// <param name="playerRectangle">Rectangle of the player</param> public void ResolveInterPenetrationWall(Rectanglef overlap, Rectanglef playerRectangle) { // If this happens, we've gotten stuck if (overlap.Contains(playerRectangle)) { int i = 0; } // If same width, collision is vertical else if (Math.Abs(overlap.Width - playerRectangle.Width) < 0.5) { if (Math.Abs(overlap.Y - playerRectangle.Y) < 0.5) { position.Y += (overlap.Height + 1); } else { position.Y -= (overlap.Height + 1); } } // If same height, collision is horizontal else if (Math.Abs(overlap.Height - playerRectangle.Height) < 0.5) { if (Math.Abs(overlap.X - playerRectangle.X) < 0.5) { position.X += (overlap.Width + 1); } else { position.X -= (overlap.Width + 1); } } else if (overlap.Width < overlap.Height) { if (Math.Abs(overlap.X - playerRectangle.X) < 0.0001) { position.X += (overlap.Width + 1); } else { position.X -= (overlap.Width + 1); } } else { if (Math.Abs(overlap.Y - playerRectangle.Y) < 0.0001) { position.Y += (overlap.Height + 1); } else { position.Y -= (overlap.Height + 1); } } }