/// <summary> /// Combines two rectangle returning the mimimal rectangle containg both rectangles. /// </summary> /// <param name="r1"></param> /// <param name="r2"></param> /// <returns></returns> public static Rectangle Combine(Rectangle r1, Rectangle r2) { if (r1.Rank != r2.Rank) throw new ArgumentException("Rectangles are defined in spaces with different ranks."); Rectangle r = new Rectangle(r1.Rank); for (int i = 0; i < r1.origin.Length; i++) { int max = r1.shape[i] + r1.origin[i]; r.origin[i] = Math.Min(r1.origin[i], r2.origin[i]); if (max < r2.origin[i] + r2.shape[i]) max = r2.origin[i] + r2.shape[i]; r.shape[i] = max - r1.origin[i]; } return r; }
/// <summary> /// Combines two rectangle returning the mimimal rectangle containg both rectangles. /// </summary> /// <param name="r"></param> /// <exception cref="ArgumentException">Different ranks.</exception> public void CombineWith(Rectangle r) { if (Rank != r.Rank) throw new ArgumentException("Rectangles are defined in spaces with different ranks."); for (int i = 0; i < origin.Length; i++) { int max = shape[i] + origin[i]; origin[i] = Math.Min(origin[i], r.origin[i]); if (max < r.origin[i] + r.shape[i]) max = r.origin[i] + r.shape[i]; shape[i] = max - origin[i]; } }
/// <summary> /// Checks whether two rectangles intersect or not. /// </summary> /// <param name="r1"></param> /// <param name="r2"></param> /// <returns></returns> public static bool HasIntersection(Rectangle r1, Rectangle r2) { if (r1.IsEmpty || r2.IsEmpty) return false; if (r1.Rank != r2.Rank) throw new ArithmeticException("r1 and r2 have different rank"); int r = r1.Rank; for (int i = 0; i < r; i++) { int a = Math.Max(r1.origin[i], r2.origin[i]); int b = Math.Min(r1.origin[i] + r1.shape[i] - 1, r2.origin[i] + r2.shape[i] - 1); if (a > b) return false; } return true; }