Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

楕円を重心からN度傾けた場合の点の変化

あらかじめ取得済みの、楕円を描く座標点があります
これを重心軸から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()