Один із способів підійти до цієї цікавої проблеми - розглянути її як надійну оцінку центру розподілу точок біваріанта. (Добре відоме) рішення - це відшаровування опуклих корпусів, поки нічого не залишиться . Центроїд останнього не порожнього корпусу локалізує центр.
(Це пов’язано з торфою . Для отримання додаткової інформації в Інтернеті знайдіть "мультиваріантний пілінг корпусу з опуклим корпусом".)
Результат для 16 ілюстрованих точок показаний як центральний трикутник на цій карті. Три навколишніх багатокутника показують послідовні опуклі корпуси. П'ять початкових пунктів (30% від загальної кількості!) Були видалені за перші два етапи.
Приклад був обчислений у R
. Сам алгоритм реалізований в середньому блоці, "опуклий лущення". Він використовує вбудовану chull
процедуру, яка повертає індекси точок на корпусі. Ці точки видаляються за допомогою вираження негативного індексування xy[-hull, ]
. Це повторюється, поки не будуть видалені останні точки. На останньому кроці центроїд обчислюється шляхом усереднення координат.
Зауважте, що у багатьох випадках проектування даних навіть не є необхідним: опуклі корпуси не зміняться, якщо оригінальні особливості не охоплюють антимеридіан (+/- 180 градусів), або полюс, або настільки обширні, що кривизна сегментів між ними буде змінити значення. (Навіть тоді кривизна буде мало турбувати, тому що лущення все ще сходиться до центральної точки.)
#
# Project the data.
#
dy <- c(8,7,5,10,7,17,19,19,21,22,22,22,24,24,26,26)
dx <- c(66,67,66,89,89,79,78,76,75,81,78,77,75,80,77,83)
lat <- (28.702 + dy/1e5) / 180 * pi
lon <- (77.103 + dx/1e5) / 180 * pi
y <- dy
x <- cos(mean(lat)) * dx
#
# Convex peeling.
#
xy <- cbind(x, y)
while(TRUE) {
hull <- chull(xy)
if (length(hull) < nrow(xy)) {
xy <- xy[-hull, ]
} else {
xy.0 <- matrix(apply(xy, 2, mean), 1, 2)
break
}
}
#
# Plot the data `xy` and the solution `xy.0`.
#
plot(range(x), range(y), type="n", asp=1)
points(x, y, pch=21, bg="#a01010")
points(xy.0, pch=24, cex=1.2, bg="#404080")