Resizing a rectangle to always fit into its unrotated space

(For those coming here looking for answers to rectangle problems it may help to see the related (and solved) question: Given a width, height and angle of a rectangle, and an allowed final size, determine how large or small it must be to fit into the area)

Suppose I had a to-be-rotated rectangle that I wanted to fill a space of 100x20.

But upon rotation, instead of the ratio of the sides being maintained, I wanted the rectangle to scale its with and height to always fit inside of the original space. Here is an example: I have the rectangle in red and its original space in light blue, with the top-left corner marked as a blue circle. The numbers to the right represent degrees.

As the red rectangle rotates it changes its dimensions to always remain inside of the original size.

enter image description here

Such that what was once a 100x20 rectangle is now at 45 degrees a 14x14 (or thereabouts) rectangle.

How could the size of the red rectangle be determined for a given angle?


First of all, there may be multiple rectangles that satisfy your conditions, e.g.

rectangles with same angle if you want specific angle of rectangle, or

rectangles with same boundary point if you want to specify a point on the boundary.

However, there is a special case where there is at most only once rectangle, i.e. if you assume that it has to touch both of your boundaries. In such case it is easy to compute it. Place the origin (point $(0,0)$) in the center of the boundary (the center of the circle), and let $(C_x,C_y)$ be the top right boundary corner (the boundary rectangle has size $2C_x \times 2C_y$ ). Let $(x,y)$ be the top right vertex of small rectangle, then it satisfies conditions ($\alpha > 0$ means counterclockwise rotation):

\begin{align*} \left[\begin{matrix}x'\\\ C_y\end{matrix}\right] &= \left[\begin{matrix}\cos\alpha&-\sin\alpha\\\sin\alpha&\cos\alpha\end{matrix}\right]\left[\begin{matrix}x\\\y\end{matrix}\right] \\\ \left[\begin{matrix}C_x\\\ y'\end{matrix}\right] &= \left[\begin{matrix}\cos\alpha&-\sin\alpha\\\sin\alpha&\cos\alpha\end{matrix}\right]\left[\begin{matrix}x\\\ -y\end{matrix}\right] \end{align*}

where $x'$ and $y'$ are just placeholders. Extracting appropriate rows from those formulae, we can transform that into one equation (notice the lack of minus sign in the matrix):

\begin{align*} \left[\begin{matrix}C_x\\\ C_y\end{matrix}\right] &= \left[\begin{matrix}\cos\alpha&\sin\alpha\\\sin\alpha&\cos\alpha\end{matrix}\right]\left[\begin{matrix}x\\\ y\end{matrix}\right] \end{align*}

with solution being:

\begin{align*} \left[\begin{matrix}\cos\alpha&\sin\alpha\\\sin\alpha&\cos\alpha\end{matrix}\right]^{-1} \left[\begin{matrix}C_x\\\ C_y\end{matrix}\right] &= \left[\begin{matrix}x\\\ y\end{matrix}\right] \\\ \sec{2\alpha}\left[\begin{matrix}\cos\alpha&-\sin\alpha\\\ -\sin\alpha&\cos\alpha\end{matrix}\right] \left[\begin{matrix}C_x\\\ C_y\end{matrix}\right] &= \left[\begin{matrix}x\\\ y\end{matrix}\right] \end{align*}

Please note, that this may not have a proper solution if $\alpha$ is to big!

Edit: Ok, I missed the comment about maximizing the area. Then again, consider this example:

rectangles with given angle

The gray figure is a rhombus (it was created by rotating the black rectangle by $2\alpha$ ). To get the inscribed rectangle with the greatest area, consider the case when the rhombus would be a square--the greatest area would be when each rectangle vertex splits the rhombus edge in half (because then it is also a square and that is the rectangle with greatest area and given perimeter). But we can scale our rhombus (that may not be a square) so that is a square, obtain the solution there, and then scale back (the area will scale accordingly)! In conclusion the rectangle of greatest area will split the rhombus edges in half.

How to compute it? You could do it using the same approach:

\begin{align*} \left[\begin{matrix}x'\\\ C_y\end{matrix}\right] &= \left[\begin{matrix}\cos\alpha&-\sin\alpha\\\sin\alpha&\cos\alpha\end{matrix}\right]\left[\begin{matrix}x\\\y\end{matrix}\right] \\\ \left[\begin{matrix}x''\\\ -C_y\end{matrix}\right] &= \left[\begin{matrix}\cos(-\alpha)&-\sin(-\alpha)\\\sin(-\alpha)&\cos(-\alpha)\end{matrix}\right] \left[\begin{matrix}x\\\ -y\end{matrix}\right] \end{align*}

However, one can do it simpler: the vertex of the inscribed rectangle splits the gray edge in half, so $$2x\sin\alpha = C_y = 2y\cos\alpha\,.$$ This works if $C_x > C_y$, otherwise you need to do the same for $C_x$ instead. Moreover, even if $C_x > C_y$, you still need to check if the rotated rectangle fits into the boundary (because it may be that $C_x = C_y + \varepsilon $ ), if not, the solution from previous part will do.

Hope that helps ;-)


Consider the following special case, of which all other cases are reflections, I think, and which is the left-right reflection of your example image.

  • The rectangle is wider than it is high.
  • The rotation angle, call it $θ_r$, is counterclockwise and between 0 and π/2 (90°).

Since we are rotating about a center, let's throw in some polar coordinates, with the center of the rectangles being the origin.

Consider the point which is the upper-right corner of the rectangle, and call it $(x_p,y_p)$. Its polar coordinates are $$(r_p,θ_p) = (\sqrt{x_p^2+y_p^2}, \operatorname{atan2}(y_p, x_p)).$$ Note that $θ_r$ is not $θ_p$, but $θ_r + θ_p$ is the angle of the upper-right point of the rotated rectangle.

We now need to find the polar radius of that point. Note that, for rotations less than π/2, that point is somewhere on the line $y = y_p$. The polar equation of that line is $r = y_p \csc θ$, so the point is $$(y_p \csc(θ_r+θ_p), θ_r+θ_p).$$

(If what you want is not the corner points of the new rectangle, but merely a scaling factor, then stop here and take the ratio of the half-diagonals of the original and rotated rectangles, that is, $\frac{y_p \csc(θ_r+θ_p)}{r_p}$.)

We then find the Cartesian form of that point, and algebraically simplify:

$$\begin{align*}&(y_p \csc(θ_r+θ_p) \cos(θ_r+θ_p), y_p \csc(θ_r+θ_p) \sin(θ_r+θ_p)) \\ = &(y_p \cot(θ_r+θ_p), y_p) \\ = &(y_p \cot(θ_r+\operatorname{atan2}(y_p, x_p)), y_p) \end{align*}$$

This gives us the upper right corner. The lower left is of course its mirror image; we now need the lower right corner (and its mirror the upper left). This corner has the same radius, but the angle $θ_r-θ_p$, so the formula

$$\begin{align*} &(y_p \csc(θ_r+θ_p) \cos(θ_r-θ_p), y_p \csc(θ_r+θ_p) \sin(θ_r-θ_p)) \\ \end{align*}$$

Trigonometrically simplifying this expression has exceeded my enthusiasm, but according to my plots it works. I also note that as the angle changes, all of the points follow straight lines, which suggests that there might be some reparameterization of the problem such that it is mostly linear formulas and one trigonometric formula of the rotation angle and aspect ratio.