Một cách để tiếp cận vấn đề thú vị này là xem nó như một công cụ ước tính mạnh mẽ của trung tâm phân phối điểm bivariate. Một giải pháp (nổi tiếng) là bóc vỏ tàu lồi cho đến khi không còn gì . Trọng tâm của thân tàu không trống cuối cùng nằm ở trung tâm.
(Điều này có liên quan đến bagplot . Để biết thêm thông tin, hãy tìm kiếm trên Web cho "lồi vỏ lồi đa biến ngoại lệ.")
Kết quả cho 16 điểm minh họa được hiển thị dưới dạng tam giác trung tâm trong bản đồ này. Ba đa giác xung quanh cho thấy các thân lồi liên tiếp. Năm điểm ngoại vi (30% tổng số!) Đã bị xóa trong hai bước đầu tiên.
Ví dụ đã được tính toán trong R
. Thuật toán tự nó được thực hiện trong khối giữa, "lột lồi". Nó sử dụng chull
thói quen tích hợp sẵn, trả về các chỉ số của các điểm trên thân tàu. Những điểm này được loại bỏ bằng các biểu thức lập chỉ mục tiêu cực xy[-hull, ]
. Điều này được lặp lại cho đến khi các điểm cuối cùng sẽ được gỡ bỏ. Ở bước cuối cùng, trọng tâm được tính bằng cách lấy trung bình các tọa độ.
Lưu ý rằng trong nhiều trường hợp, việc chiếu dữ liệu thậm chí không cần thiết: vỏ lồi sẽ không thay đổi trừ khi các tính năng ban đầu trải dài theo đường phản xạ (+/- 180 độ), hoặc cực, hoặc rộng đến mức độ cong của các đoạn giữa chúng sẽ tạo nên sự khác biệt. (Ngay cả khi đó độ cong sẽ ít được quan tâm, bởi vì bong tróc vẫn sẽ hội tụ đến một điểm trung tâm.)
#
# 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")