Hãy giúp chúng tôi dịch trang web này cũng như cải tiến bản dịch tiếng Anh các trang của chúng tôi, Bạn sẽ nhận được phiên bản đơn giản có bản quyền.
Người dùng vô danh  |  Đăng nhập  |  Tạo tài khoản


Points inside a gPolygon
Chuyển về thư viện mã lệnh
Autor: alee
Publicado: 11/12/2007
Leído: 6046 veces
Comentarios (0)
Valoracion: 3,384615


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




Powered by Subgurim.NET and Comunactivo