我正在重构一个显示绘图的图形程序。该程序使用自己的转换,代码非常复杂。我想用转换矩阵来重构代码。
窗口和视图坐标向右X,Y向下。
窗口中的绘图使用左上角点作为基点(0,0)。视图是一个屏幕矩形区域,左上角也有基点(0,0)。
视图区域可以是屏幕上的任何矩形。它显示了80%x80%区域内的绘图,留下了一些边缘。
图纸的宽度为x高度。程序应在两个方向上以相同的比例显示图形。图形的中心映射到视图区域的中心。图纸可以在0~360度之间的任何角度旋转。
根据以下数据,通用转换矩阵是什么:
答案 0 :(得分:2)
首先,您需要包含旋转图像的框的宽度/高度
x0 = image_width/2 * cos(angle) + image_height/2 * sin(angle)
x1 = image_width/2 * cos(angle) - image_height/2 * sin(angle)
y0 = image_width/2 * sin(angle) + image_height/2 * cos(angle)
y1 = image_width/2 * sin(angle) - image_height/2 * cos(angle)
rotated_width = max(abs(x0), abs(x1)) * 2
rotated_height = max(abs(y0), abs(y1)) * 2
然后您需要计算两个维度中的哪个将是缩放约束
sf = min((view_width - 2*border) / rotated_width,
(view_height - 2*border) / rotated_height)
然后你可以计算3x2变换矩阵
m11 = sf*cos(angle)
m12 = sf*sin(angle)
m21 = -sf*sin(angle)
m22 = sf*cos(angle)
m31 = view_width/2 - image_width/2 * m11 - image_height/2 * m21
m32 = view_height/2 - image_width/2 * m12 - image_height/2 * m22