algorithm - 是否有任何数值稳定的多边形质心查找算法版本?

标签 algorithm geometry polygon numeric

假设我有一个几乎退化的二维多边形,例如:

[[40.802,9.289],[40.875,9.394],[40.910000000000004,9.445],[40.911,9.446],[40.802,9.289]]

作为引用,它看起来像:

enter image description here

如果我使用如图所示的标准质心算法 on Wikipedia ,例如这个 python 代码:

pts = [[40.802,9.289],[40.875,9.394],[40.910000000000004,9.445], [40.911,9.446],[40.802,9.289]]
a = 0.0
c = [0.0, 0.0]
for i in range(0,4):
    k = pts[i][0] * pts[i + 1][1] - pts[i + 1][0] * pts[i][1]
    a += k
    c = [c[0] + k * (pts[i][0] + pts[i + 1][0]), c[1] + k * (pts[i][1] + pts[i + 1][1])]
c = [c[0] / (3 * a), c[1] / (3 * a)]

我得到 c = [-10133071.666666666, -14636692.583333334]。在 a == 0.0 的其他情况下,我也可能得到除以零。

我最理想的是,在最坏的情况下,质心等于顶点之一或多边形内的某处,并且不应使用任意容差来避免这种情况。是否有一些聪明的方法来重写方程式以使其在数值上更稳定?

最佳答案

当面积为零(或非常接近于零,如果您无力进行精确算术),最好的选择可能是采用点集的周长质心。

周长质心由多边形每条边的中点加权和(权重为相应边的长度)与多边形周长的比值给出。

使用精确算法,可以计算出这种情况下的质心。 centroid vs perimeter centroid 红色点是周长质心,绿色点是真正的质心

我用 sage 精确计算了质心 https://cloud.sagemath.com/projects/f3149cab-2b4b-494a-b795-06d62ae133dd/files/2016-08-17-102024.sagews .

人们一直在寻找一种方法将这些点相互联系起来 -- https://math.stackexchange.com/questions/1173903/centroids-of-a-polygon .

关于algorithm - 是否有任何数值稳定的多边形质心查找算法版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981954/

相关文章:

c++ - 如何使用 C++ 查找 N x M 数组内最小值(不同列)的总和?

java - 多边形内的测试点

mysql - 如何关闭 mysql GIS 空间扩展中的开放多边形

c# - 在二维数组中选择相似项目组的算法

javascript - 如何拆分具有连续大写和小写字母的字符串(以获得分子的原子数)?

algorithm - 在路上保持正确的车道

iphone - iOS 上的圆形按钮

php - Mysql 检索多边形数据

algorithm - 最小化矩阵中 x 和 y 之间的曼哈顿距离

ios - 检测一个点是否在 iPhone sdk ios 7 中的 MKCircle 内部