假设一个尺寸为 (2, 2) 的图像 I。图形坐标 C 给出为:
C = [[0, 0], [1, 0],
[0, 1], [1, 1]]
目标:围绕中心(不是原点)将 I 旋转 90 度。
转换矩阵:
TRotate(90) = [[0, 1], [-1, 0]]
(假设每个坐标对都可以同步变换(即在 GPU 上)。)
方法:
- 将图形坐标转换为以原点为图像中心的数学坐标。
- 应用变换矩阵。
- 转换回图形坐标。
例如:
转换为图形坐标:
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|