← All problems

1401. Circle and Rectangle Overlapping

MediumOpen on LeetCodeProblem statement

Problem Statement

1401. Circle and Rectangle Overlapping

Medium


You are given a circle represented as (radius, xCenter, yCenter) and an axis-aligned rectangle represented as (x1, y1, x2, y2), where (x1, y1) are the coordinates of the bottom-left corner, and (x2, y2) are the coordinates of the top-right corner of the rectangle.

Return true if the circle and rectangle are overlapped otherwise return false. In other words, check if there is any point (xi, yi) that belongs to the circle and the rectangle at the same time.

 

Example 1:

Input: radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
Output: true
Explanation: Circle and rectangle share the point (1,0).

Example 2:

Input: radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
Output: false

Example 3:

Input: radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
Output: true

 

Constraints:

Java

Source file
class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        // Circle inside Rectangle
        if (x1 <= xCenter && x2 >= xCenter && y1 <= yCenter && y2 >= yCenter)
            return true;

        // Circle on a side of Rectangle
        if (x1 <= xCenter && x2 >= xCenter && y2 <= yCenter && yCenter - y2 <= radius) // top
            return true;
        if (x1 <= xCenter && x2 >= xCenter && y1 >= yCenter && y1 - yCenter <= radius) // bottom
            return true;
        if (y1 <= yCenter && y2 >= yCenter && x1 >= xCenter && x1 - xCenter <= radius) // left
            return true;
        if (y1 <= yCenter && y2 >= yCenter && x2 <= xCenter && xCenter - x2 <= radius) // left
            return true;

        // Circle in corner of Rectangle cases
        if (distSquare(xCenter, yCenter, x1, y1) <= radius * radius) // bottom left
            return true;
        if (distSquare(xCenter, yCenter, x2, y2) <= radius * radius) // top right
            return true;
        if (distSquare(xCenter, yCenter, x1, y2) <= radius * radius) // top left
            return true;
        if (distSquare(xCenter, yCenter, x2, y1) <= radius * radius) // bottom right
            return true;

        return false;
    }

    long distSquare(int x1, int y1, int x2, int y2) {
        return (long) Math.pow(x1 - x2, 2) + (long) Math.pow(y1 - y2, 2);
    }
}