Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.45 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Rectangles
  4. {
  5.     public static class RectanglesTask
  6.     {
  7.         // Пересекаются ли проекции
  8.         public static bool AreProjectionIntersected(int c0, int len0, int c1, int len1)
  9.         {
  10.             return c0 < c1 ? (c0 + len0) >= c1 : (c1 + len1) >= c0;
  11.         }
  12.  
  13.         // Пересекаются ли два прямоугольника (пересечение только по границе также считается пересечением)
  14.         public static bool AreIntersected(Rectangle r1, Rectangle r2)
  15.         {
  16.             // так можно обратиться к координатам левого верхнего угла первого прямоугольника: r1.Left, r1.Top
  17.             return AreProjectionIntersected(r1.Top, r1.Height, r2.Top, r2.Height) &&
  18.                 AreProjectionIntersected(r1.Left, r1.Width, r2.Left, r2.Width);
  19.         }
  20.  
  21.         // Площадь пересечения
  22.         public static int IntersectSquare(Rectangle r1, Rectangle r2)
  23.         {
  24.             var xIntersection = Math.Min(r1.Right, r2.Right) - (r1.Left < r2.Left ? r2.Left : r1.Left);
  25.             var yIntersection = Math.Min(r1.Bottom, r2.Bottom) - (r1.Top < r2.Top ? r2.Top : r1.Top);
  26.             return xIntersection * yIntersection;
  27.         }
  28.  
  29.         // Площадь пересечения прямоугольников
  30.         public static int IntersectionSquare(Rectangle r1, Rectangle r2)
  31.         {
  32.             return AreIntersected(r1, r2) ? IntersectSquare(r1, r2) : 0;
  33.         }
  34.        
  35.         // Содержит ли r1 вершины r2
  36.         public static bool IsContainPoints(Rectangle r1, Rectangle r2)
  37.         {
  38.             return (r1.Left <= r2.Left) && (r1.Top <= r2.Top)
  39.                 && (r1.Right >= r2.Right) && (r1.Bottom >= r2.Bottom);
  40.         }
  41.  
  42.         // Если один из прямоугольников целиком находится внутри другого — вернуть номер (с нуля) внутреннего.
  43.         // Иначе вернуть -1
  44.         // Если прямоугольники совпадают, можно вернуть номер любого из них.
  45.         public static int IndexOfInnerRectangle(Rectangle r1, Rectangle r2)
  46.         {
  47.             if (AreIntersected(r1, r2))
  48.                 if (IsContainPoints(r1, r2))
  49.                     return 1;
  50.                 else if (IsContainPoints(r2, r1))
  51.                     return 0;
  52.             return -1;
  53.         }
  54.     }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement