あらかじめ取得済みの、楕円を描く座標点があります
これを重心軸からN度傾けた場合、それらの座標点がどうズレるかを計算する
実際のところ
座標点は全部で8点、これを重心を起点に15度ずらす例は以下の通り、。
折角なので、これをmatplotで描画してみます。
import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from scipy.spatial.transform import Rotation as R # 座標点のデータ points = np.array([ [0,0], [20,25], [25,50], [20,75], [0,100], [-20,25], [-25,50], [-20,75] ]) # pca(主成分分析)を実行して、座標点に基づいて重心と第一主成分(長軸の方向)を見つける pca.fit(points) centroid = np.mean(points, axis=0) # 重心 first_component = pca.components_[0] # 第一主成分 # 重心を基準に長軸をプラス方向に15度傾ける変換行列を作成 rotation_matrix = R.from_euler('z', np.radians(15)).as_matrix()[:2, :2] # 更新されたpointsから重心を引いて、原点周りで回転し、重心を足すことで新しい位置を計算 new_points = np.dot(points - centroid, rotation_matrix) + centroid # 元の座標点と新しい座標点を同じグラフ上に描画 plt.figure(figsize=(8, 6)) plt.scatter(points[:, 0], points[:, 1], color='blue', label='Original Points') plt.scatter(new_points[:, 0], new_points[:, 1], color='orange', label='Rotated Points') # 重心をプロット plt.scatter([centroid[0]], [centroid[1]], color='red', label='Centroid') # 元の長軸をプロット line_start = centroid - first_component * 100 # 適当な係数をかけて調整 line_end = centroid + first_component * 100 # 適当な係数をかけて調整 plt.plot([line_start[0], line_end[0]], [line_start[1], line_end[1]], color='green', label='Original Major Axis') # 新しい長軸の計算とプロット new_line_start = centroid - np.dot(first_component, rotation_matrix) * 100 new_line_end = centroid + np.dot(first_component, rotation_matrix) * 100 plt.plot([new_line_start[0], new_line_end[0]], [new_line_start[1], new_line_end[1]], color='purple', label='Rotated Major Axis') # タイトルとラベルの設定 plt.title('Original and Rotated Ellipse with Major Axis') plt.xlabel('X') plt.ylabel('Y') plt.legend() plt.axis('equal') plt.show()