/// <summary>
        /// Builds shaded relief.
        /// </summary>
        /// <param name="triangles">An object that enumerates triangles defining surface. All triangle coordinates should be instances of the MapAround.Geometry.Coordinate3D.</param>
        /// <param name="lightX">An X component of the light vector</param>
        /// <param name="lightY">A Y component of the light vector</param>
        /// <param name="lightZ">A Z component of the light vector</param>
        /// <param name="zFactor">A value at which to multiply z-values for luminosity calculation</param>
        /// <param name="luminosityLevelNumber">A number of resoluted luminosity levels</param>
        /// <returns>An array containing lightened polygons</returns>
        public LightenedPolygon[] BuildShadedRelief(IEnumerable <Triangle> triangles,
                                                    double lightX,
                                                    double lightY,
                                                    double lightZ,
                                                    double zFactor,
                                                    int luminosityLevelNumber)
        {
            LightenedPolygon[] result = new LightenedPolygon[luminosityLevelNumber];

            List <double> luminosity = new List <double>();

            foreach (Triangle t in triangles)
            {
                luminosity.Add(GetLuminosity(t, lightX, lightY, lightZ, zFactor));
            }

            double minL = luminosity.Min();
            double maxL = luminosity.Max();

            List <Polygon>[] collectors = new List <Polygon> [luminosityLevelNumber];

            int i = 0;

            foreach (Triangle t in triangles)
            {
                int j = (int)((luminosity[i] - minL) / ((maxL - minL) / (double)luminosityLevelNumber));

                if (j == collectors.Length)
                {
                    j--;
                }

                if (collectors[j] == null)
                {
                    collectors[j] = new List <Polygon>();
                }

                collectors[j].Add(new Polygon(new ICoordinate[] { t.Cell1.DataPoint, t.Cell2.DataPoint, t.Cell3.DataPoint }));

                i++;
            }

            i = 0;
            double luminosityRange = (maxL - minL) / (double)luminosityLevelNumber;

            foreach (List <Polygon> collector in collectors)
            {
                result[i] = new LightenedPolygon(mergeTriangles(collector), minL + luminosityRange * i + luminosityRange * 0.5);
                i++;
            }

            return(result);
        }
        /// <summary>
        /// Builds shaded relief.
        /// </summary>
        /// <param name="triangles">An object that enumerates triangles defining surface. All triangle coordinates should be instances of the MapAround.Geometry.Coordinate3D.</param>
        /// <param name="lightX">An X component of the light vector</param>
        /// <param name="lightY">A Y component of the light vector</param>
        /// <param name="lightZ">A Z component of the light vector</param>
        /// <param name="zFactor">A value at which to multiply z-values for luminosity calculation</param>
        /// <param name="luminosityLevelNumber">A number of resoluted luminosity levels</param>
        /// <returns>An array containing lightened polygons</returns>
        public LightenedPolygon[] BuildShadedRelief(IEnumerable<Triangle> triangles,
            double lightX,
            double lightY,
            double lightZ,
            double zFactor,
            int luminosityLevelNumber)
        {
            LightenedPolygon[] result = new LightenedPolygon[luminosityLevelNumber];

            List<double> luminosity = new List<double>();

            foreach (Triangle t in triangles)
                luminosity.Add(GetLuminosity(t, lightX, lightY, lightZ, zFactor));

            double minL = luminosity.Min();
            double maxL = luminosity.Max();

            List<Polygon>[] collectors = new List<Polygon>[luminosityLevelNumber];

            int i = 0;
            foreach (Triangle t in triangles)
            {
                int j = (int)((luminosity[i] - minL) / ((maxL - minL) / (double)luminosityLevelNumber));

                if (j == collectors.Length)
                    j--;

                if (collectors[j] == null)
                    collectors[j] = new List<Polygon>();

                collectors[j].Add(new Polygon(new ICoordinate[] { t.Cell1.DataPoint, t.Cell2.DataPoint, t.Cell3.DataPoint }));

                i++;
            }

            i = 0;
            double luminosityRange = (maxL - minL) / (double)luminosityLevelNumber;
            foreach (List<Polygon> collector in collectors)
            {
                result[i] = new LightenedPolygon(mergeTriangles(collector), minL + luminosityRange * i + luminosityRange * 0.5);
                i++;
            }

            return result;
        }