Dire que j'ai un polygone 2-D presque dégénéré tels que:Existe-t-il des versions numériquement stables de l'algorithme de recherche du centroïde pour les polygones?
[[40.802,9.289],[40.875,9.394],[40.910000000000004,9.445],[40.911,9.446],[40.802,9.289]]
Pour référence, cela ressemble:
Si j'utilise l'algorithme standard de barycentre comme indiqué on Wikipedia, par exemple ce code 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)]
Je reçois c = [-10133071.666666666, -14636692.583333334]
. Dans d'autres cas où a == 0.0
je pourrais également obtenir une division par zéro. Ce que j'aimerais idéalement, c'est que dans le pire des cas, le centroïde soit égal à l'un des sommets ou quelque part dans le polygone, et qu'aucune tolérance arbitraire ne soit utilisée pour éviter cette situation. Y a-t-il une manière intelligente de réécrire l'équation pour la rendre plus stable numériquement?
Une chose simple que vous pourriez essayer est de déplacer le polygone entier à l'origine (c'est-à-dire soustraire la moyenne des coins).Cela vous donnerait au moins une plus grande précision en virgule flottante. –
Votre programme est erroné, 'c' ne doit pas être multiplié par' k'. (Mais après fixation, l'instabilité numérique reste.) –
@NicoSchertler: Je ne pense pas que cela aide, le problème est la zone proche de zéro. –