C++ Raylib 如何检测矩形与圆碰撞的边

C++ Raylib how to detect the side of a rectangle that a circle has collided with

我可以使用函数 CheckCollisionCircleRec(Vector2{ x, y }, radius, paddleRect) 简单地查明我的圆是否与我的矩形发生碰撞,但我希望能够查明我的圆与矩形的哪一侧发生碰撞。我该怎么做呢? None 我制作的算法正在运行。我最近的错误示例:

if (x - radius <= 0 || x + radius >= screenWidth) {
            speedX *= -1;
        }
        else if (y - radius <= 0 || y + radius >= screenHeight) {
            speedY *= -1;
        }
        else if (CheckCollisionCircleRec(Vector2{ x, y }, radius, paddleRect)) {
            float paddleBottom = paddleRect.y + paddleRect.height;
            float paddleRight = paddleRect.x + paddleRect.width;

            if (range(paddleRect.x, paddleRect.x + speedX / 100, x + radius)) {
                x = paddleRect.x - radius;
                speedX *= -1;
            }
            if (range(paddleRight - speedX / 100, paddleRight, x - radius)) {
                x = paddleRight + radius;
                speedX *= -1;
            };

            if (range(paddleRect.y, paddleRect.y + speedY / 100, y + radius)) {
                y = paddleRect.y - radius;
                speedY *= -1;
            }
            if (range(paddleBottom - speedY / 100, paddleBottom, y - radius)) {
                y = paddleBottom + radius;
                speedY *= -1;
            };

编辑: 这是我用来获得工作最终结果的函数:

// px and py are the ball's previous locations
// x and y are the ball's current locations

void checkCollision(Rectangle rectangle) {

    int left = rectangle.x;
    int right = rectangle.x + rectangle.width;
    int top = rectangle.y;
    int bottom = rectangle.y + rectangle.height;

    if (CheckCollisionCircleRec(Vector2{ x, y }, radius, rectangle)) {

        if (px < left) {
            speedX = negative(speedX);
            x = left - radius;
        }
        else if (px > right) {
            speedX = positive(speedX);
            x = right + radius;
        }
        else if (py < top) {
            speedY = negative(speedY);
            y = top - radius;
        }
        else if (py > bottom) {
            speedY = positive(speedY);
            y = bottom + radius;
        };
    };
};

一个简单的方法是使用您圈子的先前位置。不确定你是否可以在你的程序中,但是因为你有一个 x 和 y 方便,我假设你可以有一个 prevX 和 prevY。我还将假设这些值代表圆的中心。

现在,如果 (prevX < paddleRect.x),那么您可能会与左侧发生碰撞(不能保证,但完全准确地解决歧义需要以越来越小的时间步长递归地模拟您的物理,这可能是不必要的这里)。您还可以使用 if (prevX < paddleRect.x && prevY > paddleRect.y && prevY < paddleRect.y + paddRect.height 之类的内容更严格地限制它。您可以添加各种约束,具体取决于您希望在检测到一侧之前被击中的干净程度。可以添加角点等

使用之前位置的原因是,如果你的圆圈移动得足够快,那么在一帧中它可以直接跳到矩形的中间。 current-location collision

通常需要使用之前的位置来给出更具体的碰撞信息