【问题标题】:How to compute the center of a polygon in 2D and 3D space如何计算 2D 和 3D 空间中多边形的中心
【发布时间】:2013-08-20 18:32:19
【问题描述】:

考虑二维笛卡尔空间中的简单凸多边形。如果给定一个按逆时针方向排序的顶点坐标列表,例如[[x0, y0], ..., [xn, yn]]。如何计算多边形的中心(多边形内与所有顶点等距的点)?

还要考虑第二种情况,即多边形放置在 3D 笛卡尔空间中,并且其法线向量不平行于任何笛卡尔轴。 不旋转多边形如何计算中心?

我可以阅读 C/C++、Fortran、MATLAB 和 Python,但是任何伪代码也很受欢迎。

编辑

我现在意识到我的问题不是很好。我对此感到抱歉。看来我正在寻找的是多边形的质心(即假设均匀密度和均匀重力场,纸板切口将平衡的点)。

【问题讨论】:

  • mean(x) mean (y) ?我不确定所有多边形是否存在与所有顶点等距的点(例如 (0,0), (0,1), (0,-1), (3,0) 处的四边形点)。
  • 那不是四边形而是T形
  • 一般来说,大多数多边形不会有一个与所有顶点等距的点。你知道它们是正常的吗?
  • 确定这些点的凸包(如果你愿意,将 (0,0) 移动到 (-0.0001, 0))。无论哪种方式,我认为您所描述的中心一般都不存在。你可以看看en.wikipedia.org/wiki/Centroid#Centroid_of_polygon,如果'质心'是你所追求的。

标签: c++ python matlab geometry polygon


【解决方案1】:

您对中心的定义通常没有意义。

要查看这一点,只需在平面上绘制三个未对齐的点,然后计算一个唯一的圆通过所有三个点。很明显,你的三角形中心一定是这个圆的中心。

现在绘制一个不在圆上的第四个点并形成四边形多边形。什么是中心?平面上没有与所有顶点等距的点。

还要注意,即使在三角形的情况下,使用与顶点等距的点也可以为您提供远离多边形的点,并且在数值上也是不稳定的(给定任何 ε>0 和 M>0,您总是可以构建一个三角形其中一个顶点的特定移动小于 ε 的距离会使中心移动大于 M 的距离。

易于计算的常用“中心”是所有顶点的平均值、边界的平均值、质心,甚至只是轴对齐边界框的中心。但是,如果多边形不是凸面,它们都可能落在多边形之外,但在您的情况下它们可能会起作用。

最简单合理的一种(因为它不依赖于坐标系)是顶点的重心(Python中的代码):

xc = sum(x for (x, y) in points) / len(points)
yc = sum(y for (x, y) in points) / len(points)

不好的一点是,仅仅分割多边形的一侧会给你一个不同的中心(换句话说,它取决于顶点,而不是多边形所包围的点集)。取决于多边形的最简单的是 IMO 边界的重心:

sx = sy = sL = 0
for i in range(len(points)):   # counts from 0 to len(points)-1
    x0, y0 = points[i - 1]     # in Python points[-1] is last element of points
    x1, y1 = points[i]
    L = ((x1 - x0)**2 + (y1 - y0)**2) ** 0.5
    sx += (x0 + x1)/2 * L
    sy += (y0 + y1)/2 * L
    sL += L
xc = sx / sL
yc = sy / sL

对于他们两个来说,3d 的扩展都是微不足道的......只需使用相同的公式添加 z

在一般(不一定是凸的,不一定是简单连接的)多边形的情况下,我发现有用但计算起来并不简单的“中心”是距边界(换句话说,一个“最内部”的点)。

在这种情况下,我使用了离散(位图)表示和高斯距离变换。

【讨论】:

    【解决方案2】:

    首先,对于多边形,质心可能并不总是意味着从质心到顶点的等距长度。在大多数情况下,这可能不是真的。话虽如此,您只需找到x 坐标的平均值和y 坐标的平均值即可找到质心。在 Matlab 中:centroidx = mean(xcoords)centroidy = mean(ycoords) 是质心的坐标。如果您真的需要更多,请参阅this

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2011-03-06
      • 2014-10-09
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多