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