如何计算二维空间中绕非原点旋转的点的旋转中心
2D旋转中心计算方法
前提说明
单个绕固定中心旋转的点,最少需要3个非共线的观测位置才能唯一确定旋转中心。仅2个观测位置时,只能得到旋转中心所在的垂直平分线,有无穷多解。
无噪声场景几何解法
核心依据:旋转中心到所有观测点的距离完全相等。
假设三个观测点坐标分别为$P_1(x_1,y_1)$、$P_2(x_2,y_2)$、$P_3(x_3,y_3)$,待求旋转中心为$O(x_0,y_0)$,计算步骤如下:
- 对$P_1$和$P_2$列距离相等的方程,展开消去二次项后得到第一个线性方程:
$2(x_2 - x_1)x_0 + 2(y_2 - y_1)y_0 = x_2^2 + y_2^2 - x_1^2 - y_1^2$ - 对$P_2$和$P_3$做同样处理,得到第二个线性方程:
$2(x_3 - x_2)x_0 + 2(y_3 - y_2)y_0 = x_3^2 + y_3^2 - x_2^2 - y_2^2$ - 求解上述二元一次方程组,得到的$x_0$、$y_0$就是旋转中心坐标。
你也可以通过几何作图验证:分别作$P_1P_2$、$P_2P_3$的垂直平分线,两条线的交点就是旋转中心,和方程求解结果完全一致。
有噪声场景最小二乘解法
如果观测点存在测量误差,或你有超过3个观测点,可以用最小二乘拟合得到鲁棒性更高的结果:
- 将所有相邻观测点对按上述方式生成对应的线性方程,得到超定方程组$Ax = b$
- 其中每一行对应的系数为$A_i = [2(x_{i+1}-x_i), 2(y_{i+1}-y_i)]$,$b_i = x_{i+1}^2 + y_{i+1}^2 - x_i^2 - y_i^2$
- 求解最小二乘解$x = (ATA){-1}A^Tb$,$x$的两个分量就是旋转中心的最优估计值。
Python 实现示例
import numpy as np def find_rotation_center(points): # points为形状(N,2)的数组,存储N个观测点坐标,N≥3 A = [] b = [] for i in range(len(points) - 1): x1, y1 = points[i] x2, y2 = points[i+1] A.append([2 * (x2 - x1), 2 * (y2 - y1)]) b.append(x2**2 + y2**2 - x1**2 - y1**2) A = np.array(A) b = np.array(b) # 最小二乘求解,返回(x0, y0) center, _, _, _ = np.linalg.lstsq(A, b, rcond=None) return center
内容的提问来源于stack exchange,提问作者zed_eln
相关产品推荐
相关产品推荐

