我有一个矩形,必须旋转总是相同的度数.让我们称这个角度为alpha().
该矩形的宽度(w)和高度(h)可以变化.矩形始终适合在大矩形内旋转.必须按比例放大或缩小以适合灰色矩形.
注意:Alpha是w和水平线之间的角度.
那么,有3种矩形在哪里
w > h
w < h or
w = h
Run Code Online (Sandbox Code Playgroud)
见下图.

我知道的:
我需要知道的:
这是我到目前为止所做的,但这并没有给出正确的值:
CGPoint P = CGPointZero;
if (ratioWH > 0) { // means w > h
maxH = R / (ratioWH * fabsf(cosf(theta)) + fabsf(sinf(theta)));
maxW = maxH * ratioWH;
// P.x = 0.0f; // P.x is already zero
CGFloat marginY = (K - maxW * fabsf(sinf(theta)) - maxH * fabsf(cosf(theta))) / 2.0f;
P.y = marginY + maxW * fabsf(sinf(theta));
} else { // w <= h
maxW = K / (fabsf(cosf(theta) / ratioImagemXY) + fabsf(sinf(theta)));
maxH = maxW / ratioWH;
P.x = (R - maxW * fabsf(cosf(theta)) - maxH * fabsf(sinf(theta))) / 2.0f;
P.y = maxW * fabsf(sinf(theta));
}
Run Code Online (Sandbox Code Playgroud)
任何线索?谢谢.
我的看法是这样的......你计算出矩形的总宽度和总高度。为此,您只需沿着两条边缘行走即可。像这样:
dx = w * cos(theta) + h * sin(theta)
dy = h * cos(theta) + w * sin(theta)
Run Code Online (Sandbox Code Playgroud)
这些可能是负数,因此如果矩形旋转到其他象限,将应用特殊处理。这将在稍后发生。
您现在只需要宽度和高度之间的比率。您可以在此处决定是否按垂直量或水平量进行缩放。w它与和无关h——它实际上与矩形旋转后的最终位置有关。这就是dx和dy的用途。
rectratio = abs( dx / dy )
viewratio = R / K
Run Code Online (Sandbox Code Playgroud)
如果rectratio结果大于viewratio该值,则意味着需要缩放旋转矩形的水平足迹。否则,您将按垂直足迹进行缩放。
if rectratio > viewratio
scale = R / abs(dx)
else
scale = K / abs(dy)
end
Run Code Online (Sandbox Code Playgroud)
并且比例本身应用于原始宽度和高度
sw = scale * w
sh = scale * h
Run Code Online (Sandbox Code Playgroud)
现在您可以计算矩形的角了。从哪里开始并不重要。
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)
Run Code Online (Sandbox Code Playgroud)
我假设图像坐标为 (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
Run Code Online (Sandbox Code Playgroud)
left现在是top我们的子视图的“最小”坐标,它完全包含矩形(免除浮点舍入错误)。所以:
left += pxmin
top += pymin
Run Code Online (Sandbox Code Playgroud)
现在它们是将矩形移动到所需位置所需的偏移量。您所要做的就是将left和添加top到所有矩形坐标中,然后就完成了。的位置P是px[0]和py[0]。如果旋转 90 度或更多,它就不会是左上角的顶点。