Python 任意多边形的宽度

Python 任意多边形的宽度,python,computational-geometry,Python,Computational Geometry,我需要一种方法来描述二维点集的大小,以便根据视口的比例确定是将它们渲染为空间中的单个点还是作为代表性多边形。我已经有了一个算法来计算集合的凸包,以生成具有代表性的多边形,但是我需要一种方法来描述它的大小。一个明显的度量是凸包上点之间的最大距离,即集合的直径。但我更感兴趣的是垂直于直径的横截面的大小,来计算出边界多边形有多窄。给定顶点和最远点的索引的排序列表(理想情况下在Python中),是否有一种简单的方法可以做到这一点 或者,是否有一种简单的方法来计算一组点的最小面积边界椭圆的半径?我已经看到

我需要一种方法来描述二维点集的大小,以便根据视口的比例确定是将它们渲染为空间中的单个点还是作为代表性多边形。我已经有了一个算法来计算集合的凸包,以生成具有代表性的多边形,但是我需要一种方法来描述它的大小。一个明显的度量是凸包上点之间的最大距离,即集合的直径。但我更感兴趣的是垂直于直径的横截面的大小,来计算出边界多边形有多窄。给定顶点和最远点的索引的排序列表(理想情况下在Python中),是否有一种简单的方法可以做到这一点

或者,是否有一种简单的方法来计算一组点的最小面积边界椭圆的半径?我已经看到了一些解决这个问题的方法,但是没有任何方法可以轻易地转换为Python,所以我真的在寻找一种可以完全解决这个问题的方法。

您可以计算:

垂直于其直径的横截面尺寸

通过以下步骤:

  • 求凸壳
  • 找到相距最远的两点
    a
    b
  • 找到这两个向量之间的方向向量
    d=(a-b).normalized()
  • 使用矩阵旋转轴,使该方向向量水平:

    [ d.x, d.y]
    [-d.y, d.x]
    
  • 在此新坐标系中查找点的最小和最大y值。区别在于你的“宽度”

  • 请注意,这不是“宽度”的一个特别好的定义,更好的定义是:

    两条不同平行线之间的最小垂直距离,每条平行线至少有一个点与多边形的边界相同,但与多边形的内部没有相同点


    另一个有用的大小定义可能是外壳上点与中心之间平均距离的两倍

    center = sum(convexhullpoints) / len(convexhullpoints)
    size = 2 * sum(abs(p - center) for p in convexhullpoints) / len(convexhullpoints)
    

    在我看来,所有人所要做的就是旋转两个相距最远的凸面外壳点,然后沿x(而不是y)轴取它们的差来确定外壳的宽度。@martineau:这只是给出OP所指的直径。我现在意识到了,但我想这是你使用的“宽度”这似乎是一个合理的近似值。如果你愿意的话,它给出了多边形可以滑动通过的间隙的最小宽度,如果它只是平行于直径平移的话。如果你也可以垂直滑动它,它可能会穿过一个较小的间隙,如果连接点的线本身不垂直于直径,但我认为这个近似会很好地工作。谢谢这种方法行不通。例如:给定一个正方形,相距最远的两点沿对角线。旋转正方形使其对角线水平,则沿y轴的范围比正方形宽度长
    sqrt(2)
    倍。可以使用旋转卡钳算法计算宽度(请参阅)。