3

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

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

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

编辑

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

4

2 回答 2

10

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

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

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

还要注意,即使在三角形的情况下,使用与顶点等距的点也可以为您提供远离多边形的点,并且在数值上也是不稳定的(给定任何 ε>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使用相同的公式添加即可。

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

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

于 2013-08-19T05:58:14.723 回答
4

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

于 2013-08-19T03:02:44.167 回答