C++ 如何计算二维和三维空间中多边形的中心

C++ 如何计算二维和三维空间中多边形的中心,c++,python,matlab,geometry,polygon,C++,Python,Matlab,Geometry,Polygon,考虑二维笛卡尔空间中的一个简单凸多边形。如果给定一个按逆时针方向排序的顶点坐标列表,像这样[[x0,y0],…,[xn,yn]。如何计算多边形的中心(多边形内部与所有顶点等距的点) 也考虑第二种情况,多边形放置在三维笛卡尔空间中,其法线向量不平行于任何笛卡尔轴。如果不旋转多边形,如何计算圆心 我可以阅读C/C++、Fortran、MATLAB和Python,但是任何伪代码也很受欢迎 编辑 我现在意识到我的问题提出得不好。对此我很抱歉。似乎我要寻找的是多边形的质心(即,假设密度和重力场均匀时,纸板

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

也考虑第二种情况,多边形放置在三维笛卡尔空间中,其法线向量不平行于任何笛卡尔轴。如果不旋转多边形,如何计算圆心

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

编辑


我现在意识到我的问题提出得不好。对此我很抱歉。似乎我要寻找的是多边形的质心(即,假设密度和重力场均匀时,纸板切口的平衡点)。

首先,对于多边形,质心可能并不总是意味着从质心到顶点的等距长度。在大多数情况下,这可能不是真的。也就是说,只需找到
x
坐标的平均值和
y
坐标的平均值,就可以找到质心。在Matlab中:
centroidx=mean(xcoords)
centroidy=mean(ycoords)
是质心的坐标。看看你是否真的需要更多。

你对中心的定义通常没有意义

要看到这一点,只需在一个平面上画三个不对齐的点,并计算一个唯一的圆,该圆将通过所有三个点。很明显,三角形的中心必须是这个圆的中心

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

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

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

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

不好的是,仅仅分割多边形的一侧就可以得到一个不同的中心(换句话说,它取决于顶点,而不是多边形边界上的一组点)。依赖于多边形的最简单的方法是边界的重心:

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

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


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

均值(x)均值(y)
?我不确定所有多边形是否存在与所有顶点等距的点(例如,(0,0)、(0,1)、(0,-1)、(3,0)处的四边形点)。这不是四边形而是T形。通常,大多数多边形不会有一个与所有垂直面等距的点。你知道它们是规则的吗?确定这些点的凸包(如果愿意,将(0,0)移动到(-0.0001,0)).不管怎样,我认为你所描述的中心在总体上并不存在。你可以看看“质心”是否就是你所追求的。
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