public List <LakeEdge> BuildPasses()//List<LakeNode> lakes) { Dictionary <HashSet <ErosionNode>, LakeEdge> lake_passes = new Dictionary <HashSet <ErosionNode>, LakeEdge>(); foreach (ErosionEdge edge in edges) { if (((ErosionNode)edge.GetNodes()[0]).Lake != ((ErosionNode)edge.GetNodes()[1]).Lake) { LakeEdge ledge = new LakeEdge(((ErosionNode)edge.GetNodes()[0]), ((ErosionNode)edge.GetNodes()[1])); if (!lake_passes.ContainsKey(ledge.Nodes) || ledge.Height < lake_passes[ledge.Nodes].Height) { lake_passes[ledge.Nodes] = ledge; } } } List <LakeEdge> passes = new List <LakeEdge>(); passes.AddRange(lake_passes.Values); /* * foreach (LakeNode lake in lakes) * { * seen_lakes.Add(lake); * Dictionary<LakeNode,LakeEdge> lake_passes = new Dictionary<LakeNode,LakeEdge>(); * foreach (ErosionNode node in lake.nodes) * { * foreach (ErosionNode other in node.GetNeighbors()) * { * if (!seen_lakes.Any(l => l == other.Lake)) * { * float height = Math.Max(node.Height, other.Height); * if (!lake_passes.ContainsKey(other.Lake) || height < lake_passes[other.Lake].Height) * { * lake_passes[other.Lake] = new LakeEdge(node, other); * } * } * } * } * passes.AddRange(lake_passes.Values); * } */ return(passes); }
public List <LakeEdge> IteratePasses(List <LakeEdge> passes) { List <LakeEdge> candidates = new List <LakeEdge>(); List <LakeEdge> chosen_passes = new List <LakeEdge>(); HashSet <LakeEdge> to_remove = new HashSet <LakeEdge>(); foreach (LakeEdge pass in passes) { int count = 0; foreach (ErosionNode node in pass.Nodes) { if (node.Lake.oceanic) { count++; pass.Receiver = node; to_remove.Add(pass); } } if (count == 1) { candidates.Add(pass); } else if (count >= 2) { //Debug.Log(count); //candidates.Add(pass); } } foreach (LakeEdge pass in to_remove) { passes.Remove(pass); } while (candidates.Count > 0) { candidates.Sort((a, b) => a.Height.CompareTo(b.Height)); LakeEdge pass = candidates[0]; candidates.Remove(pass); chosen_passes.Add(pass); to_remove = new HashSet <LakeEdge>(); foreach (LakeEdge c_pass in passes) { foreach (ErosionNode node in c_pass.Nodes) { if (pass.Nodes.Any(t => t.Lake == node.Lake)) { c_pass.Receiver = node; to_remove.Add(c_pass); candidates.Add(c_pass); break; } } } foreach (LakeEdge c_pass in to_remove) { passes.Remove(c_pass); } to_remove = new HashSet <LakeEdge>(); foreach (LakeEdge c_pass in candidates) { if (c_pass.Source.Lake == pass.Source.Lake) { to_remove.Add(c_pass); } } foreach (LakeEdge c_pass in to_remove) { candidates.Remove(c_pass); } } return(chosen_passes); }