วิธีหนึ่งในการแก้ไขปัญหาที่น่าสนใจนี้คือการมองว่าเป็นตัวประมาณค่าที่แข็งแกร่งของจุดศูนย์กลางของการกระจายจุดแบบไบวาเรีย A (ที่รู้จักกันดี) แก้ปัญหาคือการลอกเปลือกออกไปนูนจนไม่มีอะไรเหลือ เซนทรอยด์ของฮัลล์ที่ไม่ว่างตัวสุดท้ายอยู่ตรงกลาง
(สิ่งนี้เกี่ยวข้องกับพล็อตสำหรับข้อมูลเพิ่มเติมค้นหาเว็บเพื่อหา "ตัวนูนนูนออกมาหลายตัวแปร")
ผลลัพธ์สำหรับ 16 จุดที่แสดงนั้นจะแสดงเป็นรูปสามเหลี่ยมกลางในแผนที่นี้ รูปหลายเหลี่ยมทั้งสามล้อมรอบแสดงลำตัวนูนต่อเนื่อง ห้าคะแนนรอบนอก (30% ของยอดรวม!) ถูกลบออกในสองขั้นตอนแรก
R
ตัวอย่างที่ได้รับการคำนวณใน อัลกอริทึมนั้นถูกนำไปใช้ในบล็อกตรงกลาง "การลอกแบบนูน" มันใช้chull
รูทีนในตัวซึ่งจะส่งกลับดัชนีของจุดบนตัวถัง xy[-hull, ]
จุดเหล่านี้จะถูกลบออกโดยวิธีการของการจัดทำดัชนีการแสดงออกเชิงลบ สิ่งนี้ซ้ำไปซ้ำมาจนกว่าจะลบคะแนนสุดท้าย ในขั้นตอนสุดท้ายเซนทรอยด์จะถูกคำนวณโดยหาค่าพิกัดโดยเฉลี่ย
โปรดทราบว่าในหลาย ๆ กรณีการฉายข้อมูลนั้นไม่จำเป็นด้วยซ้ำ: ตัวถังนูนจะไม่เปลี่ยนแปลงเว้นแต่คุณสมบัติดั้งเดิมจะขยาย antimeridian (+/- 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")