在Python中近似凸壳的纵横比的最佳方法是什么?我已经尝试通过将凸包的顶点与椭圆拟合并取半轴和长轴的比率来做到这一点。结果并不令人满意,所以我现在正在考虑直接从凸包中推导出纵横比。任何想法或解决方案将不胜感激。
干杯
答案 0 :(得分:8)
通常,您会找到点云的协方差矩阵的特征向量。纵横比是最大特征值与最小特征值的比率。
作为一组随机点的示例(您只需将相同的东西应用于凸包,仅使用顶点):
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()