如何在Python中旋转几何图形使其主轴与坐标系对齐?
问题解决思路
- 计算坐标的协方差矩阵:由于质心已在原点,直接通过X、Y坐标计算协方差矩阵,该矩阵的特征向量对应图形的主轴方向。
- 特征值分解:对协方差矩阵进行特征值分解,特征值最大的特征向量即为图形的长轴方向,特征值较小的对应短轴方向。
- 构造旋转矩阵:利用特征向量组成正交矩阵,这个矩阵就是将图形主轴对齐到坐标轴的旋转矩阵。
- 坐标旋转:将原始坐标点与旋转矩阵相乘,得到主轴对齐后的新坐标。
Python实现代码
import numpy as np import matplotlib.pyplot as plt # 原始坐标 x = [-2.38, -1.68, -0.97, -0.26, -0.97, -0.26, 0.45, 1.15, 1.86, 2.57, 1.86, 1.15, 0.45, -0.26, -0.97, -1.68] y = [-1.24, -0.53, 0.18, 0.88, 1.59, 2.3, 1.59, 0.88, 0.18, -0.53, -1.24, -0.53, 0.18, -0.53, -1.24, -1.94] # 将坐标转换为numpy数组,形状为(2, n) coords = np.vstack((x, y)) # 计算协方差矩阵 cov_matrix = np.cov(coords) # 特征值分解,获取特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 按特征值从大到小排序,获取对应特征向量的索引 sorted_indices = np.argsort(eigenvalues)[::-1] sorted_eigenvectors = eigenvectors[:, sorted_indices] # 构造旋转矩阵(特征向量矩阵本身就是正交旋转矩阵) rotation_matrix = sorted_eigenvectors.T # 执行坐标旋转 aligned_coords = rotation_matrix @ coords # 可视化对比效果 plt.figure(figsize=(10, 5)) plt.subplot(121) plt.scatter(x, y, color='blue') plt.title('原始图形') plt.axis('equal') plt.subplot(122) plt.scatter(aligned_coords[0], aligned_coords[1], color='red') plt.title('主轴对齐后图形') plt.axis('equal') plt.show()
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

