估算凸包的长宽比

11 投票
1 回答
1754 浏览
提问于 2025-04-16 23:35

在Python中,如何大致计算一个凸包的长宽比呢?我之前尝试过用一个椭圆来拟合凸包的顶点,然后计算椭圆的短轴和长轴的比例。但是结果不太理想,所以我现在想直接从凸包中得出长宽比。有没有什么好的想法或者解决方案呢?

谢谢!

1 个回答

12

通常情况下,你会找到点云的协方差矩阵的特征向量。长宽比就是最大的特征值和最小的特征值之间的比值。

举个例子,对于一堆随机点(你只需对你的凸包做同样的事情,只不过用的是顶点):

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

撰写回答