Classifique as coordenadas de latitude e longitude em quadrilátero ordenado no sentido horário
Problema
Os usuários podem fornecer até quatro coordenadas de latitude e longitude, em qualquer ordem. Eles fazem isso com o Google Maps. Usando o GooglePolygon
API (v3), as coordenadas que eles selecionam devem destacar a área selecionada entre as quatro coordenadas.
Pergunta, questão
Como você classifica uma matriz de coordenadas de latitude e longitude na ordem (anti-horária) no sentido horário?
Soluções e Pesquisas
Perguntas sobre StackOverflow
Desenho de polígonos redimensionáveis (sem interseção)Como classificar pontos em um polígono do Google Maps para que as linhas não se cruzem?Classificar quatro pontos na ordem dos ponteiros do relógioSites relacionados
http://www.daftlogic.com/projects-google-maps-area-calculator-tool.htmhttp://en.literateprograms.org/Quickhull_%28Javascript%29http://www.geocodezip.com/map-markers_ConvexHull_Polygon.asphttp://softsurfer.com/Archive/algorithm_0103/algorithm_0103.htmAlgoritmos conhecidos
A varredura de Graham (muito complicada)Algoritmo de Jarvis March (manipula N pontos)Casco convexo recursivo (remove um ponto)Código
Aqui está o que eu tenho até agora:
// 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;
}
Obrigado.