How does one find the coordinates of the 4 corners of a bounding box of a square of width w and height h that is rotated theta degrees and is offset from the origin x in the x direction and y in the y direction?

Here is a visual example of what I mean:

image of 4 corners of bounding box

Here is some python3 code that I came up with, but it only works in the right quadrants except when theta = 0 or 360 or etc.:

import math

def bounds(x,y,w,h,theta):
   theta = theta * math.pi / 180

   A = ( x, y+round((math.sin(theta)*w), 2) )
   B = ( x+round((w/math.sin(theta)), 2), y+round((math.sin(theta)*w), 2) )
   C = ( x+round((w/math.sin(theta)), 2), y+round((math.cos(theta)*h), 2) )
   D = ( x, y+round((math.cos(theta)*h), 2) )

I was reading this but I could not figure it out for my specific problem.

Any help is much appreciated. Next time I will use matrices to store all the transformation data because this would be so much easier that way.

  • 1
    \$\begingroup\$ i recommend you the book Christer Ericson Real-Time Collision Detection thank me latter. Bye bye \$\endgroup\$
    – Haruko
    May 21 '17 at 17:33
  • \$\begingroup\$ @Haruko Thanks for this. This should be especially helpful when building a 3D environment that involves any sort of collision. \$\endgroup\$
    – Ibrahim
    May 21 '17 at 18:38

Figured it out. The main part is finding out how to get the corners of the square. I suggest brute forcing through the trigonometry on paper to figure out how to get the 4 corners of the square. After that, it's just a matter of finding the width between the furthest corners in the x direction and finding the height between the furthest corners in the y direction, and finally adding them up with the top-left x,y coordinates of the bounding box, appropriately for each corner of the bounding box.

Here is a pseudo code:

// corner functions (tricky part)
get_top_left_corner = function() {
    return [my_x, my_y]

get_top_right_corner = function() {
    angle = to_radians(my_angle)
    return [my_x + cos(angle) * my_w,
            my_y - sin(angle) * my_w]

get_bottom_left_corner = function() {
    angle = to_radians(my_angle)
    return [my_x + sin(angle) * my_h,
            my_y + cos(angle) * my_h]

get_bottom_right_corner = function() {
    angle = to_radians(my_angle)
    return [(my_x + cos(angle) * my_w)  +  (sin(angle) * my_h),
            (my_y - sin(angle) * my_w)  +  (cos(angle) * my_h)]

// [x,y] coordinates of corners of rotated square
tl = get_top_left_corner()
tr = get_top_right_corner()
bl = get_bottom_left_corner()
br = get_bottom_right_corner()

// coordinates of bounding box's top left corner
ax = min( tl.x, tr.x, bl.x, br.x )
ay = min( tl.y, tr.y, bl.y, br.y )

// width & height of bounding box
w = max( tl.x, tr.x, bl.x, br.x ) - ax
h = max( tl.y, tr.y, bl.y, br.y ) - ay

// [x,y] coordinates of bounding box's corners
A = [ax, ay]
B = [ax + w, ay]
C = [ax + w, ay + h]
D = [ax, ay + h]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.