简体   繁体   English

带填充的矩形圆交点

[英]Rectangle Circle Intersection with Padding

I have the following method which works great to test if a rectangle intersects a circle. 我有以下方法可以很好地测试矩形是否与圆相交。 How could I modify it to say provide an additional parameter, the padding, which means that the rectangle and the circle need to be a certain number of pixels away from each other? 我怎么能修改它来说提供一个额外的参数,填充,这意味着矩形和圆圈需要相隔一定数量的像素?

public static boolean rectangleCircleIntersection(RectangleRegion rect, CircularRegion circle, int padding) {
        int circleDistance_x = PsyMath.abs((circle.getX()+circle.getRadius()) - (rect.getX()+rect.getWidth()/2));
        int circleDistance_y = PsyMath.abs((circle.getY()+circle.getRadius()) - (rect.getY()+rect.getHeight()/2));

        if (circleDistance_x > (rect.getWidth()/2 + circle.getRadius())) { return false; }
        if (circleDistance_y > (rect.getHeight()/2 + circle.getRadius())) { return false; }

        if (circleDistance_x <= (rect.getWidth()/2)) { return true; } 
        if (circleDistance_y <= (rect.getHeight()/2)) { return true; }

        int cornerDistance_sq = (int)Math.pow((circleDistance_x - rect.getWidth()/2),2) +
                             (int)Math.pow((circleDistance_y - rect.getHeight()/2),2);

        return (cornerDistance_sq <= (int)Math.pow(circle.getRadius(),2));
    }

This was my attempt, but I'm not too confident it's correct: 这是我的尝试,但我不太自信这是正确的:

public static boolean rectangleCircleIntersection(RectangleRegion rect, CircularRegion circle, int padding) {
        int circleDistance_x = PsyMath.abs((circle.getX()+circle.getRadius()) - (rect.getX()+rect.getWidth()/2));
        int circleDistance_y = PsyMath.abs((circle.getY()+circle.getRadius()) - (rect.getY()+rect.getHeight()/2));

        if (circleDistance_x > (rect.getWidth()/2 + circle.getRadius() + padding)) { return false; }
        if (circleDistance_y > (rect.getHeight()/2 + circle.getRadius() + padding)) { return false; }

        if ((circleDistance_x+padding) <= (rect.getWidth()/2)) { return true; } 
        if ((circleDistance_y+padding) <= (rect.getHeight()/2)) { return true; }

        int cornerDistance_sq = (int)Math.pow((circleDistance_x - rect.getWidth()/2),2) +
                             (int)Math.pow((circleDistance_y - rect.getHeight()/2),2);

        return (cornerDistance_sq <= (int)Math.pow(circle.getRadius(),2));
    }

instead of using rect.getWidth() and rect.getHeight, you can add padding to width and height and that new padded dimension. 而不是使用rect.getWidth()和rect.getHeight,您可以添加填充到宽度和高度以及新的填充尺寸。

const int PADDING = 5;
int rectHeight = rect.getHeight() + PADDING;
int rectWidth = rect.getWidth() + PADDING;

//use rectHeight and rectWidth for calculation now

EDIT: to account for padding on left you should adjust the position used in your calculation, 编辑:要考虑左边的填充,你应该调整计算中使用的位置,

int posX = rect.getX() - PADDING/2;
int posY = rect.getY() - PADDING/2;
int rectHeight = rect.getHeight() + PADDING/2;
int rectWidth = rect.getWidth() + PADDING/2;

Just FYI, what you are essentially doing with that padding is creating a bigger rectangle around the current rectangle. 仅供参考,您基本上使用该填充做的是在当前矩形周围创建一个更大的矩形。

You can safely pad the circle and then check if they intersect. 您可以安全地填充圆圈,然后检查它们是否相交。 Padding the rectangle is not quite okay because the corners of the padded rectangle will be sqrt(2) times the padding away from the corners of the original rectangle. 填充矩形不太合适,因为填充矩形的角将是距离原始矩形的角的填充的sqrt(2)倍。

So, assuming the code above works great, and that the radius is an int, you'd get: 所以,假设上面的代码工作得很好,并且半径是一个int,你会得到:

public static boolean rectangleCircleIntersection(RectangleRegion rect, CircularRegion circle, int padding) {
    int paddedRadius = circle.getRadius() + padding;
    int circleDistance_x = PsyMath.abs((circle.getX()+paddedRadius) - (rect.getX()+rect.getWidth()/2));
    int circleDistance_y = PsyMath.abs((circle.getY()+paddedRadius) - (rect.getY()+rect.getHeight()/2));

    if (circleDistance_x > (rect.getWidth()/2 + paddedRadius)) { return false; }
    if (circleDistance_y > (rect.getHeight()/2 + paddedRadius)) { return false; }

    if (circleDistance_x <= (rect.getWidth()/2)) { return true; } 
    if (circleDistance_y <= (rect.getHeight()/2)) { return true; }

    int cornerDistance_sq = (int)Math.pow((circleDistance_x - rect.getWidth()/2),2) +
                         (int)Math.pow((circleDistance_y - rect.getHeight()/2),2);

    return (cornerDistance_sq <= (int)Math.pow(paddedRadius,2));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM