예제 #1
0
 private static bool ValidateRectangle(Rect rectangleA)
 {
     if(rectangleA.Width < 1 || rectangleA.Height < 1)
     {
         return false;
     }
     return true;
 }
예제 #2
0
 /// <summary>
 /// Checks for containment relationship between two rectangles.
 /// </summary>
 /// <param name="rectangleA"></param>
 /// <param name="rectangleB"></param>
 /// <returns> Returns true if RectangleA entirely contains RectangleB or 
 /// if RectangleB entirely contains RectangleA</returns>
 public static bool CheckContainment(Rect rectangleA, Rect rectangleB)
 {
     if (!ValidateRectangle(rectangleA) || !ValidateRectangle(rectangleB))
     {
         return false;
     }
     bool outside = false;
     // look for an edge in the (potentially) smaller rectangle outside the bigger rectangle
     if (rectangleA.Width > rectangleB.Width)
     {
         outside = ((rectangleB.Left < rectangleA.Left) ||
                    (rectangleB.Right > rectangleA.Right) ||
                    (rectangleB.Top > rectangleA.Top) ||
                    (rectangleB.Bottom < rectangleA.Bottom));
     }
     else
     {
         outside = ((rectangleA.Left < rectangleB.Left) ||
                    (rectangleA.Right > rectangleB.Right) ||
                    (rectangleA.Top > rectangleB.Top) ||
                    (rectangleA.Bottom < rectangleB.Bottom));
     }
     return !outside;
 }
예제 #3
0
        /// <summary>
        /// Checks whether two rectangles intersect by finding out the intersection points.
        /// </summary>
        /// <param name="rectangleA"></param>
        /// <param name="rectangleB"></param>
        /// <returns>True if rectangles intersect else false</returns>
        public static bool CheckIntersection(Rect rectangleA, Rect rectangleB, out ArrayList InterSectingPoints)
        {
            InterSectingPoints = new ArrayList();
            if (!ValidateRectangle(rectangleA) || !ValidateRectangle(rectangleB))
            {
                return false;
            }
            if (rectangleA.Left > rectangleB.Left && rectangleA.Left < rectangleB.Right)
            {
                // Left side of rectangle A lies in between rectangle B edges.
                // Check if it intersects
                if (rectangleB.Top < rectangleA.Top && rectangleB.Top > rectangleA.Bottom)
                {
                    Point pointIntersection = new Point(rectangleA.Left, rectangleB.Top);
                    InterSectingPoints.Add(pointIntersection);
                }
                if (rectangleB.Bottom < rectangleA.Top && rectangleB.Bottom > rectangleA.Bottom)
                {
                    Point pointIntersection = new Point(rectangleA.Left, rectangleB.Bottom);
                    InterSectingPoints.Add(pointIntersection);
                }
            }

            if (rectangleA.Right > rectangleB.Left && rectangleA.Right < rectangleB.Right)
            {
                // Right side of rectangle A lies in between rectangle B edges.
                // Check if it intersects
                if (rectangleB.Top < rectangleA.Top && rectangleB.Top > rectangleA.Bottom)
                {
                    Point pointIntersection = new Point(rectangleA.Right, rectangleB.Top);
                    InterSectingPoints.Add(pointIntersection);
                }
                if (rectangleB.Bottom < rectangleA.Top && rectangleB.Bottom > rectangleA.Bottom)
                {
                    Point pointIntersection = new Point(rectangleA.Right, rectangleB.Bottom);
                    InterSectingPoints.Add(pointIntersection);
                }
            }

            if (rectangleA.Top > rectangleB.Bottom && rectangleA.Top < rectangleB.Top)
            {
                // Top side of rectangle A lies in between rectangle B Top and Bottom.
                // Check if it intersects
                if (rectangleB.Left < rectangleA.Right && rectangleB.Left > rectangleA.Left)
                {
                    Point pointIntersection = new Point(rectangleB.Left, rectangleA.Top);
                    InterSectingPoints.Add(pointIntersection);
                }
                if (rectangleB.Right < rectangleA.Right && rectangleB.Right > rectangleA.Left)
                {
                    Point pointIntersection = new Point(rectangleB.Right, rectangleA.Top);
                    InterSectingPoints.Add(pointIntersection);
                }
            }

            if (rectangleA.Bottom > rectangleB.Bottom && rectangleA.Bottom < rectangleB.Top)
            {
                // Top side of rectangle A lies in between rectangle B Top and Bottom.
                // Check if it intersects
                if (rectangleB.Left < rectangleA.Right && rectangleB.Left > rectangleA.Left)
                {
                    Point pointIntersection = new Point(rectangleB.Left, rectangleA.Bottom);
                    InterSectingPoints.Add(pointIntersection);
                }
                if (rectangleB.Right < rectangleA.Right && rectangleB.Right > rectangleA.Left)
                {
                    Point pointIntersection = new Point(rectangleB.Right, rectangleA.Bottom);
                    InterSectingPoints.Add(pointIntersection);
                }
            }
            return (InterSectingPoints.Count > 0);
        }
예제 #4
0
 /// <summary>
 /// Checks if two rectangles have adjacent edges
 /// </summary>
 /// <param name="rectangleA"></param>
 /// <param name="rectangleB"></param>
 /// <returns>True if there is adjacency</returns>
 public static bool CheckAdjacent(Rect rectangleA, Rect rectangleB)
 {
     if(!ValidateRectangle(rectangleA) || !ValidateRectangle(rectangleB))
     {
         return false;
     }
     bool adjacent = false;
     if (rectangleA.Left == rectangleB.Right ||
         rectangleA.Right == rectangleB.Left ||
         rectangleA.Left == rectangleB.Left ||
         rectangleA.Right == rectangleB.Right)
     {
         // Now that we have a common side check if it is proper or sub-line
         if (rectangleA.Top >= rectangleB.Top)
         {
             adjacent = (rectangleB.Bottom >= rectangleA.Bottom);
         }
         if (!adjacent && rectangleB.Top >= rectangleA.Top)
         {
             adjacent = (rectangleA.Bottom >= rectangleB.Bottom);
         }
     }
     if (rectangleA.Top == rectangleB.Bottom ||
         rectangleA.Bottom == rectangleB.Top ||
         rectangleA.Top == rectangleB.Top ||
         rectangleA.Bottom == rectangleB.Bottom)
     {
         if (rectangleA.Right >= rectangleB.Right)
         {
             adjacent = (rectangleB.Left >= rectangleA.Left);
         }
         if (!adjacent && rectangleB.Right >= rectangleA.Right)
         {
             adjacent = (rectangleA.Left >= rectangleB.Left);
         }
     }
     return adjacent;
 }