Ordenar las coordenadas de latitud y longitud en cuadrilátero ordenado en sentido horario

Problema

Los usuarios pueden proporcionar hasta cuatro coordenadas de latitud y longitud, en cualquier orden. Lo hacen con Google Maps. Usando GooglePolygon API (v3), las coordenadas que seleccionan deben resaltar el área seleccionada entre las cuatro coordenadas.

Pregunta

¿Cómo se ordena una matriz de coordenadas de latitud y longitud en orden (en sentido contrario a las agujas del reloj)?

Soluciones y Búsquedas

Preguntas de StackOverflow

Dibujar polígonos redimensionables (sin intersección)¿Cómo ordenar los puntos en un polígono de Google Maps para que las líneas no se crucen?Ordenar cuatro puntos en orden horario

Sitios 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 Conocidos

Escaneo de Graham (demasiado complicado)Algoritmo de Jarvis March (maneja N puntos)Casco convexo recursivo (elimina un punto)

Código

Esto es lo que tengo hasta ahora:

// 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;
}

Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta