2011-08-14 8 views
6

凸包のアスペクト比をPythonで近似するにはどうすればよいでしょうか?私は既に、凸包の頂点を楕円で近似し、半軸と長軸の比を取ることでこれを試みました。しかし、結果は満足のいくものではないので、私は現在、凸包から直接アスペクト比を導出することを検討しています。どんなアイデアや解決策も大変ありがとうございます。凸包のアスペクト比の推定

いいえお返事

+0

あなたは側面とはどういう意味ですかこのコンテキストでの比率と、それをどのように凸包から直接派生させたいのですか? –

+1

凸包のアスペクト比はどのように定義しますか?異なる角度を許可したいので、回転した長方形の縦横比を取得できますか?軸に0°と90°を使用したいだけなら、アスペクト比は計算が簡単です。 –

+0

0度と90度は、次のようにアスペクト比を求めることですか? 1)凸包の主軸(重心を通る凸包の最長軌道)と2)長軸に直交する短軸を計測する。そうであれば、それはうまくいくはずです。 – ebressert

答えて

7

通常、ポイントクラウドの共分散行列の固有ベクトルを見つけることができます。アスペクト比は、最大固有値と最小固有値の比です。ランダムな点の束のための一例として、

(あなただけの頂点のみを使用して、あなたの凸包に同じことを適用したい):

import matplotlib.pyplot as plt 
import numpy as np 

# Random data 
num = 100 
xy = np.random.random((2,num)) + 0.01 * np.arange(num) 

eigvals, eigvecs = np.linalg.eig(np.cov(xy)) 

fig, (ax1, ax2) = plt.subplots(nrows=2) 
x,y = xy 
center = xy.mean(axis=-1) 
for ax in [ax1, ax2]: 
    ax.plot(x,y, 'ro') 
    ax.axis('equal') 

for val, vec in zip(eigvals, eigvecs.T): 
    val *= 2 
    x,y = np.vstack((center + val * vec, center, center - val * vec)).T 
    ax2.plot(x,y, 'b-', lw=3) 

plt.show() 

enter image description here

+0

これは良い解決策です。私は自分のデータでこのコードをテストしていますが、これまでのところ良い結果が得られました。ありがとう! – ebressert