/**** Explicación / Description ****/
Castellano
La función GetPointsIntoPolygon recibe como parámetro una lista de GLatLng que representan los puntos ordenados de un polígono y otra lista de GLatLng que son los puntos que queremos saber si están dentro de este polígono.
IsOnRigth nos indica si el punto esta sobre la derecha o izquierda de la recta que une dos puntos del polígono.
La forma de determinar si un punto esta dentro de un poligono es saber cuantas veces se encuentra a la derecha de las rectas que conforman los puntos.
Recordar pasar en orden los puntos del poligono como si se fuera a escribir a mano.
En algun aspx que tenga un mapa utilicen un foreach para recorrer el retorno de GetPointsIntoPolygon y tendran los puntos que estan dentro de la zona que pasaron como parametro.
Alejo Pagadizabal.
English
/**** Código de servidor / Server code ****/
using System.Collections.Generic;
using Subgurim.Controles;
/// <summary>
/// recorre todas las rectas de poligono y ve si los puntos estan dentro de esta zona.
/// si la cantidad de veces que esta a la derecha de las rectas es impar entonces esta dentro.
/// </summary>
/// <param name="Polypuntos"></param>
/// <param name="puntos"></param>
/// <returns></returns>
public List<GLatLng> GetPointsIntoPolygon(List<GLatLng> Polypuntos, List<GLatLng> puntos)
{
List<GLatLng> retorno = new List<GLatLng>();
Polypuntos.Add(Polypuntos[0]);
int x = 0;
int valor = 0;
foreach (GLatLng punto in puntos)
{
x = 0;
valor = 0;
while (x + 1 < Polypuntos.Count)
{
if (IsOnRigth(Polypuntos[x], Polypuntos[x + 1], punto))
valor++;
x++;
}
//si es impar entonces esta dentro de punto.
if ((valor % 2) != 0)
retorno.Add(punto);
}
return retorno;
}
/// <summary>
/// Retorna true si el punto esta a la derecha.
/// </summary>
/// <param name="PolyPointA"></param>
/// <param name="PolyPointB"></param>
/// <param name="point"></param>
/// <returns></returns>
private Boolean IsOnRigth(GLatLng PolyPointA, GLatLng PolyPointB, GLatLng point)
{
//x = Long
//y = Lat
double M = 0;
double LngInFunction = 0;
//Si el punto esta entre la Lat de los dos puntos
if ((PolyPointA.lat >= point.lat && PolyPointB.lat <= point.lat) || (PolyPointB.lat >= point.lat && PolyPointA.lat <= point.lat))
{
M = (PolyPointA.lat - PolyPointB.lat) / (PolyPointA.lng - PolyPointB.lng);
LngInFunction = ((point.lat - PolyPointA.lat) / M) + PolyPointA.lng;
//si esta a la derecha, sumo uno, sino no hago nada.
if (LngInFunction <= point.lng)
return true;
}
return false;
}