我有一个W x H的矩形。
在该矩形内是另一个旋转Θ度的矩形,它始终在-45到45度之间,并且与外部矩形共享相同的中心。我需要找到w和h,以使内部矩形的面积最大化。
这是一个(贫民窟)图像来说明一点。虽然,矩形的角应该是触摸的,我假设?
这是我要写的函数的原型:
SizeD GetMaxRectangleSize(double outerWidth, double outerHeight, float angle)
SizeD只是一个宽度和高度为双精度的结构。
感谢评论指引我朝着正确的方向前进!
我的解决方案,虽然可能不是数学上最优的,但假设如果内部矩形的所有四个角落在外部矩形上,则区域将最大化。
因此:
H = wSin(ϴ) + hCos(ϴ)
W = wCos(ϴ) + hSin(ϴ)
求解w和h并代入给出:
h = (HCos(ϴ) - WSin(ϴ))/(cos(ϴ)^2 - sin(ϴ)^2)
w = (WCos(ϴ) - HSin(ϴ))/(cos(ϴ)^2 - sin(ϴ)^2)
哪种情况适用于Θ= [0,45],而(-45,0)应该起作用。
答案 0 :(得分:2)
这个问题的棘手部分不是如何计算内部矩形的面积,而是所有可能的内部矩形中哪一个具有最大面积?
首先,观察图像中的方框是否是相同的区域,无论它是如何水平滑动的,如果它滑到最右边的墙上,它可以轻松地将问题参数化如下: / p>
我发现更容易想到这个问题,固定盒旋转偏移角度,使内部盒子以标准方向排列。这是一个数字(我已将theta
更改为beta
,因为我可以在Mac上轻松输入,并且由于明确的原因也离开了最左边的墙:
所以想想这个构造如下:在外部矩形的右侧选择一个点(这里用一个小圆圈显示),注意从这一点到角落的距离a
,构造最大的可能的内部有一个角落(通过将垂直和水平线延伸到外部矩形)。显然,最大可能的矩形是从a
的不同值派生的矩形之一,而a
是此问题的一个很好的参数。
因此,内部矩形的区域是:
A = (a * (H-a))/(cosß * sinß)
or, A = c * a * (H-a)
我把恒定的三角项折叠成常数c
。我们需要最大化这个,并且要做到这一点,衍生物是有用的:
dA/da = c * (H - 2a)
也就是说,从a=0
开始(即图中的圆圈位于外部矩形的下角,形成一个高大的超级皮肤内部矩形),然后是内部矩形的区域< strong>单调增加直到a=H/2
,然后该区域再次开始减少。
也就是说,有两种情况:
1)如果当a
从0增加到H/2
时,远处的内部角落到外部的相对墙壁,那么最大可能的矩形就是这种接触发生时(你知道它是由于单调增加而产生的最大值 - 即衍生物的正值。这是你对解决方案的猜测。
2)如果远角从不接触墙,那么最大的内部矩形将位于a=H/2
。
我没有明确地解决每个案例的内部矩形区域,因为这比证明要容易得多,任何能够遵循证明的人,我认为可以轻松计算出区域(并且花很长时间写这些东西)。