Проблема
Пользователи могут предоставлять до четырех координат широты и долготы в любом порядке. Они делают это с помощью Google Maps. Используя Google Polygon
API (v3), координаты, которые они выбирают, должны выделять выделенную область между четырьмя координатами.
Вопрос
Как вы сортируете массив координат широты и долготы в (против часовой стрелке)?
Решения и поисковые запросы
Вопросы StackOverflow
- Рисование изменяемых (не пересекающихся) полигонов
- Как отсортировать точки в полигоне карт Google, чтобы линии не пересекались?
- Сортировка четырех точек по часовой стрелке
Связанные сайты
- http://www.daftlogic.com/projects-google-maps-area-calculator-tool.htm
- http://en.literateprograms.org/Quickhull_%28Javascript%29
- http://www.geocodezip.com/map-markers_ConvexHull_Polygon.asp
- http://softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm
Известные алгоритмы
- Сканирование Graham (слишком сложное)
- Алгоритм Jarvis March (обрабатывает N точек)
- Рекурсивная выпуклая оболочка (удаляет точку)
код
Вот что я до сих пор:
// Ensures the markers are sorted: NW, NE, SE, SW
function sortMarkers() {
var ns = markers.slice( 0 );
var ew = markers.slice( 0 );
ew.sort( function( a, b ) {
if( a.position.lat() < b.position.lat() ) {
return -1;
}
else if( a.position.lat() > b.position.lat() ) {
return 1;
}
return 0;
});
ns.sort( function( a, b ) {
if( a.position.lng() < b.position.lng() ) {
return -1;
}
else if( a.position.lng() > b.position.lng() ) {
return 1;
}
return 0;
});
var nw;
var ne;
var se;
var sw;
if( ew.indexOf( ns[0] ) > 1 ) {
nw = ns[0];
}
else {
ne = ns[0];
}
if( ew.indexOf( ns[1] ) > 1 ) {
nw = ns[1];
}
else {
ne = ns[1];
}
if( ew.indexOf( ns[2] ) > 1 ) {
sw = ns[2];
}
else {
se = ns[2];
}
if( ew.indexOf( ns[3] ) > 1 ) {
sw = ns[3];
}
else {
se = ns[3];
}
markers[0] = nw;
markers[1] = ne;
markers[2] = se;
markers[3] = sw;
}
Спасибо.