Objective c 矩形内最大旋转矩形的计算点和尺寸

Objective c 矩形内最大旋转矩形的计算点和尺寸,objective-c,math,Objective C,Math,我有一个矩形,它必须始终旋转相同的度数。我们把这个角度称为alpha(我的看法是这样的…你计算出矩形的总宽度和总高度。为此,你只需沿着两条边行走。如下所示: dx = w * cos(theta) + h * sin(theta) dy = h * cos(theta) + w * sin(theta) 这些可能是负数,因此如果矩形旋转到其他象限,将应用特殊处理。这将在稍后发生 现在只需要宽度和高度之间的比率。这是决定是按垂直量还是按水平量缩放的位置。这与w和h无关——实际上是矩形由于旋转而结

我有一个矩形,它必须始终旋转相同的度数。我们把这个角度称为alpha(我的看法是这样的…你计算出矩形的总宽度和总高度。为此,你只需沿着两条边行走。如下所示:

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
现在是子视图的“最小”坐标,该子视图正好包含矩形(浮点舍入误差除外)。因此:


现在,它们是将矩形移动到所需位置所需的偏移量。您只需将
添加到所有矩形坐标,就完成了。
p
的位置是
px[0]
py[0]
。如果旋转90度或更高,它将不是左上角的顶点。

对于每种情况下的w和h,适合灰色矩形的w和h的最大值是什么意思?在您的绘图中,哪个是角度alpha?我的意思是:红色矩形必须适合灰色矩形。我已更改了该短语。alpha是w和水平线之间的角度。数学是当天的赢家=)如果我是你,我会写一个简单的测试程序来验证这一点。设置旋转360度的矩形的动画。显示视图矩形并显示
P
。尝试几个不同的
w
h
值。。。只是一个关于舍入误差的注释。注意我是如何按顺时针顺序计算顶点的。这意味着您的最后一个顶点将受到最大错误的影响。这可能对应用程序没有任何意义,但一般来说,您可能希望通过从起始位置逆时针移动来计算最后一个顶点,然后对于最远的顶点,您可以通过两条可能路径中的一条来平均到达该顶点的值。您可能还需要夹紧顶点,以确保它们实际上位于视图矩形内。修正舍入误差是一件痛苦的事。
left += pxmin
top += pymin