|
所以2-D旋转变换矩阵就是:
[cosA sinA] [cosA -sinA] [-sinA cosA] 或者 [sinA cosA]
我们对点进行旋转变换可以通过矩阵完成,比如我要点(x, y)绕原点逆时针旋转:
[cosA sinA] [x, y] x [-sinA cosA] = [x*cosA-y*sinA x*sinA+y*cosA]
为了编程方便,我们把它写成两个方阵
[x, y] [cosA sinA] [x*cosA-y*sinA x*sinA+y*cosA] [0, 0] x [-sinA cosA] = [0 0 ]
也可以写成
[cosA -sinA] [x 0] [x*cosA-y*sinA 0] [sinA cosA] x [y 0] = [x*sinA+y*cosA 0]
三、2-D的绕任一点旋转
下面我们深入一些,思考另一种情况:求一个点围绕任一个非原点的中心点旋转。
我们刚刚导出的公式是围绕原点旋转的公式,所以我们要想继续使用它,就要把想要围绕的那个非原点的中心点移动到原点上来。按照这个思路,我们先将该中心点通过一个位移向量移动到原点,而围绕点要保持与中心点相对位置不变,也相应的按照这个位移向量位移,此时由于中心点已经移动到了圆点,就可以让同样位移后的围绕点使用上面的公式来计算旋转后的位置了,计算完后,再让计算出的点按刚才的位移向量 逆 位移,就得到围绕点绕中心点旋转一定角度后的新位置了。看下面的图

现在求左下方的蓝色点围绕红色点旋转一定角度后的新位置。由于红色点不在原点,所以可以通过红色向量把它移动到原点,此时蓝色的点也按照这个向量移动,可见,红色和蓝色点的相对位置没有变。现在红色点在原点,蓝色点可以用上面旋转变换矩阵进行旋转,旋转后的点在通过红色向量的的逆向量回到它实际围绕下方红色点旋转后的位置。
在这个过程中,我们对围绕点进行了三次线性变换:位移变换-旋转变换-位移变换,我们把它写成矩阵形式:
设红色向量为(rtx, rty)
[x y 1] [1 0 0] [cosA sinA 0] [1 0 0] [x' y' -] [0 1 0] x [0 1 0] x [-sinA cosA 0] x [0 1 0] = [- - -] [0 0 1] [rtx rty 1] [0 0 1] [-rtx -rty 1] [- - -]
最后得到的矩阵的x'和y'就是我们旋转后的点坐标。
注意到矩阵乘法满足结合律:(m x M) x N = m x (M x N),我们可以先将所有的变换矩阵乘在一起,即
[1 0 0] [cosA sinA 0] [1 0 0] M = [0 1 0] x [-sinA cosA 0] x [0 1 0] [rtx rty 1] [0 0 1] [-rtx -rty 1]
然后再让
[x y 1] [0 1 0] x M [0 0 1]
像这样归并变换矩阵是矩阵运算一个常用的方法,因为当把诸多变换矩阵归并为一个矩阵之后,对某点或向量的重复变换只需要乘一个矩阵就可以完成,减少了计算的开销。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
|