이 흥미로운 문제에 접근하는 한 가지 방법은이 문제를 이변 량 점 분포 중심의 강력한 추정값으로 보는 것입니다. (잘 알려진) 해결책은 아무것도 남지 않을 때까지 볼록 껍질 을 벗겨내는 것입니다 . 비어 있지 않은 마지막 선체의 중심이 중심을 찾습니다.
(이것은 bagplot 과 관련이 있습니다. 자세한 정보는 웹에서 "볼록 껍질 벗김 다변량 특이 치"를 검색하십시오.)
16 개의 예시 된 점에 대한 결과가이 맵에서 중심 삼각형으로 표시됩니다. 세 개의 다각형은 연속적인 볼록 껍질을 보여줍니다. 처음 두 단계에서 5 개의 외곽 포인트 (총 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")