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ógio

Sites 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.htm

Algoritmos 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.

questionAnswers(3)

yourAnswerToTheQuestion