2013-08-19 258 views
2

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

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

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

编辑

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

+1

'mean(x)mean(y)'?我不确定所有多边形(例如(0,0),(0,1),(0,-1),(3,0))处的四边形点是否存在与所有顶点等距的点。 – Hugh

+0

这不是一个四边形,而是一个T形 – Aeronaelius

+1

一般来说,大多数多边形不会有与所有顶点等距的点。你知道他们是经常的吗? – PeterM

回答

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。在一个普通的(不一定是凸的,不一定是简单连接的)多边形的情况下,我发现有用但是不是简单计算的“中心”是距离它的最大距离的(内)点,边界(换句话说就是“最内在的”一点)。

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

4

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

相关问题