如何在2D和3D空间中计算多边形的中心

时间:2013-08-19 02:43:06

标签: c++ python matlab geometry polygon

在2D笛卡尔空间中考虑简单凸多边形。如果给出以逆时针方向排序的顶点坐标列表,如此[[x0, y0], ..., [xn, yn]]。你怎么能计算多边形的中心(多边形内的点与所有顶点等距)?

另外考虑第二种情况,其中多边形放置在3D笛卡尔空间中,并且其法向量不平行于任何笛卡尔轴。你怎么能计算中心,不旋转多边形?

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

修改

我现在意识到我的问题没有得到很好的解决。我对此感到抱歉。看来我正在寻找的是多边形的质心(即纸板切口在均衡密度和均匀重力场时能够平衡的点)。

2 个答案:

答案 0 :(得分:8)

你对中心的定义一般没有意义。

要看到这一点,只需在一个平面上绘制三个非对齐点,并计算一个唯一的圆圈,通过所有三个点。显然,你的三角形中心必须是这个圆圈的中心。

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

另请注意,即使三角形使用与顶点等距离的点也可以给出外部和远离多边形的点,并且在数值上也不稳定(给定任何ε> 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

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

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

答案 1 :(得分:4)

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