4

如何检查 Circle 是否完全包含 Rectangle(在 Java 中)?

public class Circle {
   //x and y define the top left corner of the square bounding this circle
   public int x, y, radius;
}

public class Rectangle {
   //x and y define the top left corner
   public int x, y, width, height;
}

public boolean circleContainsRectangle(Circle circle, Rectangle rect) {
   ...
}
4

4 回答 4

8

以下是位于左下角的cartesian轴的答案。(0, 0)

编辑 因为你x, y是正方形的左上角。将它们转换为居中:

x = x+r
y = y-r

圆的方程是x^2 + y^2 = r^2,现在给定的点将{x, y}在 iff 时位于圆内或圆上x^ + y^2 <= r^2。现在,我们可以安全地假设,如果所有四角点都位于圆内或圆上,矩形将位于圆内。使用上述假设伪代码来查找矩形是否包含在圆形中:

boolean contains(Circle c) {
    Point p_rect_1 = {x, y};
    Point p_rect_2 = {x + width, y };
    Point p_rect_3 = {x + width, y + height };
    Point p_rect_4 = {x, y + height };
    Point[] points = new Point[] { p_rect_1, p_rect_2, p_rect_3, p_rect_4 };

    foreach(Point p : points) {
        // ** is raise to power
        if ((c.x - p.x)**2 + (c.y - p.y)**2 > c.r**2) {
            return false;
        }
    }
    return true;
}

编辑 更优化的计算方法(由 Jim 在下面的评论中建议)将通过计算距圆心最远的矩形角:

dx = max(centerX - rectLeft, rectRight - centerX); 
dy = max(centerY - rectTop, rectBottom - centerY);
return radius*radius >= dx*dx + dy*dy
于 2012-12-31T04:16:47.200 回答
3

radius可能最简单的方法是检查矩形的所有四个角距圆心的距离是否小于单位。如果是,则矩形中的所有点都在圆内。您必须检查的四个点是 (x, y)、(x + width, y)、(x, y + height) 和 (x + width, y + height)。

注意:奇怪的是圆是从右上角定义的,而矩形是从左上角定义的。确保在计算圆心时考虑到这一点。

于 2012-12-31T04:08:25.470 回答
0

斯威夫特 4:

func checkCircleContainsRect(circle: Circle, rect: CGRect) -> Bool
    {
        let dx = max(abs(circle.position.x - rect.minX), abs(rect.maxX - circle.position.x))
        let dy = max(abs(circle.position.y - rect.maxY), abs(rect.minY - circle.position.y))
        return (circle.radius * circle.radius) >= (dx * dx) + (dy * dy)
    }
于 2018-01-03T18:33:50.207 回答
-1

我知道我迟到了,但我想分享我的想法,如果有什么问题的话。我只是使用 width/2 和 height/2 来定义一半的高度和一半的宽度。接下来我使用勾股定理来计算从中心到角落的距离,然后检查它是否大于半径。我知道它的 java,但我不能在其中编码,但我想用 c++ 制作相同的程序。无论如何这里的代码:

#include <iostream>
#include <math.h>

using namespace std;

void rectangle_in_circle(float w, float h,float r){
    //sides of square triangle
    float a;
    float b;
    float c;
    //pythagorean theorem
    b = h/2;
    a = w/2;
    c = sqrt(pow(b,2) + pow(a,2));
    //output
    if(c <= r){
        cout << "true" << endl;
    }else{
        cout << "false" << endl;
    }
    }

int main(){ 

    rectangle_in_circle(4,7,5);
    return 0;
}
于 2020-11-26T07:13:36.503 回答