Якщо QGIS обчислює центроїд за допомогою GEOS, який є портом JTS, алгоритм - це http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/CentroidArea.html . Про теорію існує посилання в javadoc на http://www.faqs.org/faqs/graphics/algorithms-faq/ , див. Розділ 2.02: Як можна обчислити центроїд багатокутника ?.
Центроїд (він же центр маси або центр ваги) полігона може бути обчислений як зважена сума центроїдів розбиття багатокутника на трикутники. Центроїд трикутника - це просто середнє з трьох його вершин, тобто він має координати (x1 + x2 + x3) / 3 та (y1 + y2 + y3) / 3. Це дозволяє спочатку тріангулювати багатокутник, потім сформувати суму центроїдів кожного трикутника, зважену площею кожного трикутника, всю суму, нормалізовану загальною площею багатокутника. Це дійсно працює, але є більш простий метод: триангуляція не повинна бути перегородкою, а скоріше може використовувати позитивно та негативно орієнтовані трикутники (з позитивними та негативними областями), як це використовується при обчисленні площі багатокутника. Це призводить до дуже простого алгоритму обчислення центроїда, заснованого на сумі трикутників центроїдів, зважених з їх підписаною площею. Трикутниками можна вважати такі, що утворені будь-якою нерухомою точкою, наприклад, вершиною v0 многокутника та двома кінцевими точками послідовних ребер багатокутника: (v1, v2), (v2, v3) тощо. Площа трикутника з вершинами a, b, c - половина цього виразу: (b [X] - a [X]) * (c [Y] - a [Y]) - (c [X] - a [X] ) * (b [Y] - a [Y]);
Code available at ftp://cs.smith.edu/pub/code/centroid.c (3K).
Reference: [Gems IV] pp.3-6; also includes code.
Мені здається, що метод точний. Якщо ви хочете перевірити, як використовуються значення координат, і чи можуть бути помилки округлення тощо, ви можете подивитися вихідний код JTS або GEOS.