x,y座標系の4点から「centroid, width height and orientation」を求める

convert four x,y coordinates into centroid, width height and orientation (py) – StackOverflow

“oritentation”の定義が不明瞭なので適当.本当はどっかを原点に置いて,水平,鉛直方向の傾きを出さないといけないけど,鉛直方向の傾きは水平方向より小さいので無視する.

%matplotlib inline
import matplotlib.pyplot as plt
import itertools


coords = [(7, 354), (307, 339), (304, 296), (4, 311)]
for x in coords:
    plt.scatter(*x)

FireShot Capture 213 - JupyterLab Alpha Preview - http___localhost_8888_lab

import math
import statistics


li = list(zip(*sorted(coords)))
centroid = (statistics.mean(li[0]), statistics.mean(li[1]))
width = math.hypot(li[0][3]-li[0][0], li[1][3]-li[1][0])
height = math.hypot(li[0][2]-li[0][0], li[1][2]-li[1][0])
orientation = math.atan2(li[1][3]-li[1][1], li[0][3]-li[0][1])

plt.scatter(*coords[0])
plt.scatter(coords[1][0]*math.cos(-orientation)+coords[1][0]*(-math.sin(-orientation)), coords[1][1]*(math.sin(-orientation))+coords[1][1]*(math.cos(-orientation)))
plt.scatter(coords[2][0]*math.cos(-orientation)+coords[2][0]*(-math.sin(-orientation)), coords[2][1]*(math.sin(-orientation))+coords[2][1]*(math.cos(-orientation)))
plt.scatter(*coords[3])

print(f'centroid: {centroid}')
print(f'width: {width}')
print(f'height: {height}')
print(f'orientation: {orientation}')

centroid: (155.5, 325)
width: 304.2909791630373
height: 300.3747659175118
orientation: -0.04995839572194276

FireShot Capture 215 - JupyterLab Alpha Preview - http___localhost_8888_lab

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中