如何求解二维几何的旋转角度并将其主轴对齐至坐标轴?
二维几何图形主轴对齐解决方案
要解决这个问题,核心是通过**主成分分析(PCA)**提取图形的主轴方向,计算旋转角度后完成坐标旋转对齐。以下是具体步骤和实现代码:
步骤说明
- 中心化坐标:先计算所有点的质心,将每个坐标减去质心,消除平移影响,确保旋转围绕图形中心进行。
- 计算协方差矩阵:协方差矩阵能反映X和Y坐标的相关性,是求解主轴的基础。
- 提取特征向量与特征值:协方差矩阵的特征向量对应数据的主方向,特征值越大,对应方向的方差越大(即主轴)。
- 计算旋转角度:主轴特征向量与X轴的夹角就是需要旋转的角度,公式为
θ = arctan2(特征向量y分量, 特征向量x分量),转换为角度后取合适的旋转方向。 - 坐标旋转:用旋转矩阵将所有中心化后的坐标旋转,再加上质心得到对齐后的坐标。
代码实现(Python)
import numpy as np # 输入坐标 X = [0.71, 1.41, 2.12, 2.83, 2.12, 2.83, 3.54, 4.24, 4.95, 5.66, 4.95, 4.24, 3.54, 2.83, 2.12, 1.41] Y = [-0.71, 0.0, 0.71, 1.41, 2.12, 2.83, 2.12, 1.41, 0.71, 0.0, -0.71, 0.0, 0.71, 0.0, -0.71, -1.41] # 转换为矩阵并中心化 coords = np.array([X, Y]).T centroid = np.mean(coords, axis=0) centered_coords = coords - centroid # 计算协方差矩阵 cov_matrix = np.cov(centered_coords.T) # 求解特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 找到最大特征值对应的特征向量(主轴) max_eigen_idx = np.argmax(eigenvalues) principal_axis = eigenvectors[:, max_eigen_idx] # 计算旋转角度(转换为度) rotation_angle_rad = np.arctan2(principal_axis[1], principal_axis[0]) rotation_angle_deg = np.degrees(rotation_angle_rad) # 旋转矩阵(将主轴对齐到X轴,需要旋转-rotation_angle) rotation_matrix = np.array([ [np.cos(-rotation_angle_rad), -np.sin(-rotation_angle_rad)], [np.sin(-rotation_angle_rad), np.cos(-rotation_angle_rad)] ]) # 计算对齐后的坐标 aligned_coords = np.dot(centered_coords, rotation_matrix.T) + centroid # 输出结果 print(f"图形主轴与X轴的夹角: {rotation_angle_deg:.2f} 度") print("对齐后的坐标(X, Y):") for xy in aligned_coords: print(f"({xy[0]:.2f}, {xy[1]:.2f})")
结果说明
- 运行代码后得到的
rotation_angle_deg就是图形当前主轴相对于X轴的旋转角度,若要对齐到X轴,只需将所有点旋转-rotation_angle_deg度;若要对齐到Y轴,旋转角度为90 - rotation_angle_deg度(或根据实际方向调整符号)。 - 对齐后的坐标已经将图形的最长轴(主轴)与X轴平行,满足需求。
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

