0

假设一个尺寸为 (2, 2) 的图像 I。图形坐标 C 给出为:

C = [[0, 0], [1, 0],
     [0, 1], [1, 1]]

目标:围绕中心(不是原点)将 I 旋转 90 度。

转换矩阵

TRotate(90) = [[0, 1], [-1, 0]]

假设每个坐标对都可以同步变换(即在 GPU 上)。

方法:

  1. 将图形坐标转换为以原点为图像中心的数学坐标。
  2. 应用变换矩阵。
  3. 转换回图形坐标。

例如:

转换为图形坐标:

tx' = tx - 宽度 /2

ty' = ty - 宽度 /2

C' =[[-1, -1], [0, -1],
     [-1, 0], [0, 0]]

应用变换矩阵:

C" = [[-1, 1], [-1, -0],
      [0, 1], [0, 0]]

转换回来:

C" = [[0, 2], [0, 1],
      [1, 2], [1, 1]]

转换回来超出范围...

我真的在努力争取围绕“重心”工作的适当旋转。我认为我转换为“数学坐标”是错误的。

通过将坐标转换为以下内容,我会获得更好的运气:

C' =[[-1, -1], [1, -1],
     [-1, 1], [1, 1]]

我通过观察如果原点存在于四个像素之间实现了这种转换,+ve y 轴指向下方,+ve x 轴指向右侧,那么点 (0,0) 将是 (- 1, -1) 以此类推。(由此产生的旋转和转换给出了预期的结果)。

但是,我找不到正确的变换来应用于坐标以将原点放置在中心。我尝试过使用齐次坐标的变换矩阵,但这不起作用。

编辑

对于马尔科姆的建议:

位置向量 =

[0
 0
 1]

通过减去 width/2 == 1 进行翻译:

[-1
 -1
 0]

通过乘以变换矩阵来旋转:

|-1|   | 0 1 0|   |-1|
|-1| X |-1 0 0| = | 1|
|0 |   | 0 0 1|   | 0|
4

1 回答 1

1

您需要在矩阵中增加一行,用于 x 平移和 y 平移。然后向位置向量添加一个额外的列,称为 w,它被硬编码为 1。这是确保可以使用标准矩阵乘法执行转换的技巧。

由于您需要先平移后进行旋转,因此您需要设置平移矩阵,然后乘以旋转矩阵(如果您对矩阵乘法不满意,则将它们都设为 3x3,忽略最后一列)。所以平移和旋转会相互交织。

于 2017-05-11T08:35:31.323 回答