Tony102's Blog - 计算几何
type: channel
link: https://tony102.com/index.php/tag/%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95/
items: 点和向量的旋转

点和向量的旋转
type: item
date: 2021-10-02T19:58:00+08:00
description: 摘要在二维平面直角坐标系中，对平面上的点进行旋转，是一个线性变换的过程。同理，向量旋转可以通过坐标系同样化为点的旋转。以推导向量旋转方法为例，总结点和向量的旋转方法。推导本文默认逆时针旋转，若要顺时针旋转，只需要将角度变为负即可。假设在单位圆上有一点 $B$ 与原点 $O$ 连成的向量 $\overrightarrow{OB}$ ，与 $x$ 轴之间形成的夹角为 $\alpha$ ，则 $B$ 的坐标可以表示为 $(x_0 = cos\alpha,y_0 = sin\alpha)$推广，若不是单位圆，现在的圆半径为 $R$（圆心仍在圆点上），则 $x_0 = |R| \cdot cos\alpha,y_0 = |R| \cdot sin\alpha$假如向量 $\overrightarrow{OB}$ 逆时针旋转至 $\overrightarrow{OB'}$ ，旋转角为 $\beta$，则现在 $x_1 = |R| \cdot cos(\alpha + \beta),y_1 = |R| \cdot sin(\alpha + \beta)$用实用而美丽的（yys 名言 诱导公式将其拆开得到：$x_1 = |R|\cdot(cos\alpha cos\beta - sin\alpha sin\beta),y_1 = |R| \cdot (sin\alpha cos\beta + cos\alpha sin\beta)$然后可以看见拆了括号以后两个式子都可以用 $x_0,y_0$ 来代替一些项，得到：$x_1 = x_0cos\beta - y_0sin\beta,y_1 = y_0cos\beta + x_0 sin\beta$回到摘要中说的，旋转变换是一个线性变换，可以用矩阵来表示。该矩阵叫变换矩阵。对一个点实施线性变换就是通过乘上该线性变换的矩阵完成的。在二维平面直角坐标系中的旋转变换矩阵就是：$$ \begin{bmatrix} x_0 & y_0 \end{bmatrix} \begin{bmatrix} cos\beta & sin\beta \\-sin\beta & cos\beta \end{bmatrix} = \begin{bmatrix} x_1 & y_1 \end{bmatrix} $$推广：绕任意一点旋转刚才的步骤都是绕原点旋转的，想让其绕任意一点旋转，只需要先乘上一个位移变换矩阵（变回原点）再乘上旋转变换矩阵最后再乘回来即可。比如现在想让 $(x,y)$ 绕 $(x_0,y_0)$ 逆时针旋转 $\beta \ \mathrm{rad}$ ，则最终坐标为 $(x_1,y_1)$：$$ \begin{bmatrix} x & y & 1 \\0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\0 & 1 & 0 \\ x_0 & y_0 & 1 \end{bmatrix} \begin{bmatrix} cos\beta & sin\beta & 0 \\-sin\beta & cos\beta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\0 & 1 & 0 \\ -x_0 & -y_0 & 1 \end{bmatrix} = \begin{bmatrix} x_1 & y_1 & - \\ - & - & - \\ - & - & -\end{bmatrix} $$直接写成公式就是：$x_1 = (x+x_0) cos\beta - (y+y_0)sin\beta - x_0, y_1 = (x+x_0) sin\beta + (y+y_0)cos \beta - y_0 $后记后来我了解到，在数学课上，平面直角坐标系的象限是逆时针方向转的，所以我推公式的时候，也是把 $\beta$ 角往逆时针转。但是在计科里面，许多函数是把顺时针规定为正的，所以许多 Blog 推的也是往顺时针转的。