用于查看2D绘图的变换矩阵

时间:2011-10-08 20:05:09

标签: graphics gdi+ qgraphicsview

我正在重构一个显示绘图的图形程序。该程序使用自己的转换,代码非常复杂。我想用转换矩阵来重构代码。

窗口和视图坐标向右X,Y向下。

窗口中的绘图使用左上角点作为基点(0,0)。视图是一个屏幕矩形区域,左上角也有基点(0,0)。

视图区域可以是屏幕上的任何矩形。它显示了80%x80%区域内的绘图,留下了一些边缘。

图纸的宽度为x高度。程序应在两个方向上以相同的比例显示图形。图形的中心映射到视图区域的中心。图纸可以在0~360度之间的任何角度旋转。

根据以下数据,通用转换矩阵是什么:

  1. 图纸的宽度和高度
  2. 旋转角度
  3. 视区的宽度和高度
  4. 图纸周围的边距

1 个答案:

答案 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