pythonpygamerectbreakout

How to make rect from the intersection of two?


I'm working on a breakout clone and I've been trying to figure out how to get the intersection rect of two colliding rects so I can measure how deep the ball entered the block in both x and y axis and decide which component of the velocity I'll reverse.

I figured I could calculate the depth for each case like this:

ball collision with blocks

But if I had the intersection rect than I woudn't have to worry if the ball hits the block from the left/right or top/bottom (since I would be only reversing the x and y axis respectively), thus saving me a lot of typing.

I've looked on Pygame's docs but seems it doesn't have a function for that. How would I go about solving this problem?


Solution

  • Assuming you have rectangles r1 and r2, with .left, .right, .top, and .bottom edges, then

    left = max(r1.left, r2.left);
    right = min(r1.right, r2.right);
    top = max(r1.top, r2.top);
    bottom = min(r1.bottom, r2.bottom);
    

    (with the usual convention that coordinates increase top to bottom and left to right). Finally, check that left<right and top<bottom, and compute the area:

    Area = (right - left) * (top - bottom);
    

    Alternatively, you can use the clip() function. From the docs you linked in your question:

    clip(Rect) -> Rect Returns a new rectangle that is cropped to be completely inside the argument Rect. If the two rectangles do not overlap to begin with, a Rect with 0 size is returned.