昨天跟 Claude 搏斗了好久,原来是我想错了,速速认错。


一个点 P(x,y)P(x,y) 绕 C(x0,y0)C(x_0,y_0),逆时针旋转 θ\theta,结果得到 P′(x′,y′)P'(x',y') 满足:

P′=C+R(P−C)P'=C+R(P-C)

其中 RR 是二维旋转矩阵:

[cos⁡θ−sin⁡θsin⁡θcos⁡θ]\begin{bmatrix} \cos\theta && -\sin\theta \\ \sin\theta && \cos\theta \end{bmatrix}

或者直接展开得:

x′=x0+(x−x0)cos⁡θ−(y−y0)sin⁡θy′=y0+(x−x0)sin⁡θ+(y−y0)cos⁡θx'=x_0 + (x-x_0)\cos\theta - (y-y_0)\sin\theta \\ y'=y_0 + (x-x_0)\sin\theta + (y-y_0)\cos\theta

我被“坑”的地方是对旋转矩阵的定义,或者说使用场景没有建立正确的认知,旋转矩阵作用的坐标,一定要是相对旋转中心的。
在这个 case 中,旋转中心是 CC,所以要先通过 (P−C)(P-C) 把 PP 转换到旋转中心(点 CC)的坐标系下,计算完之后,重新恢复到原来的世界坐标系下。