【问题标题】:Width of an arbitrary polygon任意多边形的宽度
【发布时间】:2012-11-05 21:23:53
【问题描述】:

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

或者,有没有一种简单的方法来计算一组点的最小区域边界椭圆的半径?我已经看到了一些解决这个问题的方法,但没有任何方法可以轻松转换为 Python,所以我真的在寻找交钥匙的东西。

【问题讨论】:

    标签: python computational-geometry


    【解决方案1】:

    你可以计算:

    垂直于其直径的横截面的大小

    通过以下步骤:

    1. 找到凸包
    2. 找到相距最远的两个点 ab
    3. 找到这两者之间的方向向量d = (a - b).normalized()
    4. 使用矩阵旋转坐标轴,使该方向向量水平放置:

      [ d.x, d.y]
      [-d.y, d.x]
      
    5. 在这个新坐标系中找到点的最小和最大 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) 倍。可以使用旋转卡尺算法计算宽度(请参阅here)。
    猜你喜欢
    • 2011-10-13
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多