计算矩形内最大旋转矩形的点和维数


我看到它的方式就是这样......你计算矩形的总宽度和总高度。 为此,你只需沿着两条边走。 喜欢这个:

dx = w * cos(theta) + h * sin(theta)
dy = h * cos(theta) + w * sin(theta)

这些可能是负面的,因此如果将矩形旋转到其他象限中,则会进行特殊处理。 这将在稍后发生。

你现在只需要宽高比。 这是您决定是按垂直量还是水平量缩放的位置。 这与wh没有任何关系 - 它实际上是由于旋转导致矩形的最终位置。 这就是dxdy所需要的。

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向下移动。 所以,如果我的数学中没有犯过错误,上面给出了矩形顶点(顺时针顺序)。

最后要做的就是规范化它们......这意味着找到pxpy的最小值。 称他们为pxminpymin 。 我不需要为此显示代码。 这个想法是计算矩形的偏移量,使得视图区域由矩形(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

现在lefttop是我们子视图的“最小”坐标,它恰好包含矩形(浮点舍入误差豁免)。 所以:

left += pxmin
top += pymin

现在,它们是将矩形移至需要的位置所需的偏移量。 你所做的只是把lefttop加到你所有的矩形坐标上,然后你就完成了。 P的位置是px[0]py[0] 。 如果您旋转了90度或更多,它将不会是左上角的顶点。

链接地址: http://www.djcxy.com/p/65501.html

上一篇: Calculating point and dimensions of maximum rotated rectangle inside rectangle

下一篇: Is rpart automatic pruning?