Exemplo n.º 1
0
        /// <summary>
        /// Checa si un punto esta dentro de un poligono
        /// </summary>
        /// <param name="test_point">El punto a probar.</param>
        /// <param name="pol">La geometría del poligono.</param>
        /// <returns>Verdadero si el punto esta dentro del poligono</returns>
        public static Boolean TestPoint(this Point3d test_point, Point3dCollection pol)
        {
            //Si el área es mayor al área del polygono el punto esta afuera.
            //Si el área es igual a 0 de algun triangulo el punto esta en una línea del poligono
            //Si la suma de las áreas es igual el punto esta dentro del poligono
            double pol_area = pol.Area(), sum_area = 0, t_area;
            //Repetimos el punto inicial del poligono para poder generar todos los triangulos
            Point3dCollection polygon = new Point3dCollection(pol.OfType <Point3d>().ToArray());

            polygon.Add(pol.OfType <Point3d>().FirstOrDefault());
            //Calculamos el área de los triangulos
            for (int i = 1; i < polygon.Count; i++)
            {
                t_area = new Point3dCollection(new Point3d[]
                {
                    test_point,
                    polygon[i - 1],
                    polygon[i]
                }).Area();
                sum_area += t_area;
                if (t_area == 0)
                {
                    return(true);
                }
                else if ((sum_area - pol_area) > 0.001)
                {
                    return(false);
                }
            }
            return(Math.Abs(sum_area - pol_area) < 0.001);
        }