计算矩形内最大旋转矩形的点和维数
我看到它的方式就是这样......你计算矩形的总宽度和总高度。 为此,你只需沿着两条边走。 喜欢这个:
dx = w * cos(theta) + h * sin(theta)
dy = h * cos(theta) + w * sin(theta)
这些可能是负面的,因此如果将矩形旋转到其他象限中,则会进行特殊处理。 这将在稍后发生。
你现在只需要宽高比。 这是您决定是按垂直量还是水平量缩放的位置。 这与w
和h
没有任何关系 - 它实际上是由于旋转导致矩形的最终位置。 这就是dx
和dy
所需要的。
rectratio = abs( dx / dy )
viewratio = R / K
如果rectratio
出来大于viewratio
这意味着旋转矩形的水平占据需要进行缩放。 否则,您会按垂直覆盖区域进行缩放。
if rectratio > viewratio
scale = R / abs(dx)
else
scale = K / abs(dy)
end
规模本身适用于原始宽度和高度
sw = scale * w
sh = scale * h
所以现在你可以计算你的矩形的角落。 从哪里开始并不重要。
x[0] = 0
x[1] = x[0] + sw * cos(theta)
x[2] = x[1] + sh * sin(theta)
x[3] = x[2] - sw * cos(theta)
y[0] = 0
y[1] = y[0] - sw * sin(theta)
y[2] = y[1] + sh * cos(theta)
y[3] = y[2] + sw * sin(theta)
假设(0,0)是左上角,我假设图像坐标,因此增加的y
向下移动。 所以,如果我的数学中没有犯过错误,上面给出了矩形顶点(顺时针顺序)。
最后要做的就是规范化它们......这意味着找到px
和py
的最小值。 称他们为pxmin
和pymin
。 我不需要为此显示代码。 这个想法是计算矩形的偏移量,使得视图区域由矩形(0,0)
到(R,K)
。
首先,我们需要找到完全包含我们旋转矩形的子视图的左右值...请记住以前的比例:
if( rectratio > viewratio )
// view is too tall, so centre vertically:
left = 0
top = (K - scale * abs(dy)) / 2.0
else
// view is too wide, so centre horizontally:
left = (R - scale * abs(dx)) / 2.0
top = 0
end
现在left
和top
是我们子视图的“最小”坐标,它恰好包含矩形(浮点舍入误差豁免)。 所以:
left += pxmin
top += pymin
现在,它们是将矩形移至需要的位置所需的偏移量。 你所做的只是把left
和top
加到你所有的矩形坐标上,然后你就完成了。 P
的位置是px[0]
和py[0]
。 如果您旋转了90度或更多,它将不会是左上角的顶点。
上一篇: Calculating point and dimensions of maximum rotated rectangle inside rectangle