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