/// <summary> /// Runs the erosion program. /// </summary> /// <param name="inHeightMap">Height map.</param> /// <param name="rainfallMap">Rainfall map.</param> /// <param name="inRules">Rules for erosion.</param> /// <param name="isWater">Whether a point is above a certain threshold for being water.</param> /// <param name="erosionMap">How much erosion each point experiences.</param> public static void Run(double[,] inHeightMap, double[,] rainfallMap, ErosionMapRules inRules, out bool[,] isWater, out double[,] erosionMap) { rules = inRules; ConstructData(); waterContained = rainfallMap; heightMap = inHeightMap; rainWater = rainfallMap; var sectionCount = SectionCount(out int sectionSpacing, out int firstSpacing); Parallel.For(0, (sectionCount), (i) => { if (i == 0) { WaterSectionFlow(0, firstSpacing); } else { WaterSectionFlow(firstSpacing + (i - 1) * sectionSpacing, firstSpacing + i * sectionSpacing); } }); WaterFullFlow(sectionSpacing, firstSpacing, sectionCount); CalculateWaterArea(); isWater = CheckWaterMap(); erosionMap = CalculateErosionMap(); }
/// <summary> /// Saves rules to given file location. /// </summary> /// <param name="fileName">File to save to, not including extension.</param> /// <param name="rules">Rules to save.</param> public static void Save(string fileName, ErosionMapRules rules) { using (StreamWriter file = new StreamWriter(fileName + ".xml", false)) { var ruleType = rules.GetType(); var serializer = new XmlSerializer(typeof(ErosionMapRules)); serializer.Serialize(file, rules); } }