static bool ConnectedCheck(PolyGraph graph, List <GameObject> gameObjects) { var xforms = gameObjects.ConvertAll(v => v.transform).ToArray(); var resolver = new RegionResolver(graph); resolver.Collect(xforms); resolver.CalculateTriangleAdjacents(); resolver.CalculateRegionAdjacents(); List <int> regionIndexs = Enumerable.Range(0, resolver.regions.Count).ToList(); List <List <string> > connectedRegions = new List <List <string> >(); while (regionIndexs.Count > 0) { List <string> connected = new List <string>(); Queue <int> queue = new Queue <int>(); queue.Enqueue(regionIndexs[0]); while (queue.Count > 0) { int i = queue.Dequeue(); regionIndexs.Remove(i); var region = resolver.regions[i]; connected.Add(region.name); foreach (int adj in region.adjacents) { if (regionIndexs.Contains(adj) && !queue.Contains(adj)) { queue.Enqueue(adj); } } } connectedRegions.Add(connected); } if (connectedRegions.Count > 1) { var log = new StringBuilder("Selected regions are not all connected, connected regions are:\n"); foreach (var names in connectedRegions) { log.AppendFormat("{{ {0} }}\n", string.Join(", ", names)); } Debug.LogError(log); return(false); } else { return(true); } }
public static void Resolve(PolyGraph graph) { Transform[] xforms = new Transform[graph.transform.childCount]; for (int i = 0; i < graph.transform.childCount; ++i) { xforms[i] = graph.transform.GetChild(i); } var resolver = new RegionResolver(graph); resolver.Collect(xforms); resolver.CalculateTriangleAdjacents(); resolver.CalculateRegionAdjacents(); resolver.CalculateRegionBorderEdges(); resolver.Apply(); }