public void placeRoads() { Debug.Log("dfs start"); // do a dfs procedure to ensure that every road sub-graph is connected to every other. dfs DFS = new dfs(); DFS.initialise(); subGraphPoints = DFS.dfsUtil(); Debug.Log(subGraphPoints.Count); Debug.Log("dfs end"); // if nodes have been marked as visited by the depth first search on the graph // use them to construct edges/roads Dictionary <Vector3, int> visitedInSubGraph = new Dictionary <Vector3, int> (); Dictionary <Vector3, Vector3> newEdges = new Dictionary <Vector3, Vector3>(); for (int i = 0; i < subGraphPoints.Count; i++) { visitedInSubGraph.Add(subGraphPoints[i], 0); newEdges.Add(subGraphPoints[i], new Vector3(-1f, -1f, -1f)); } // prune some roads that are too long. for (int i = 0; i < subGraphPoints.Count; i++) { float minimum = 10000f; visitedInSubGraph [subGraphPoints [i]] = 1; Vector3 minVertex = new Vector3(); for (int j = 0; j < subGraphPoints.Count; j++) { if (j != i && visitedInSubGraph[subGraphPoints[j]] != 1) { float distance = Vector3.Distance(subGraphPoints[i], subGraphPoints[j]); if (distance < minimum) { minimum = distance; minVertex = subGraphPoints [j]; newEdges [subGraphPoints [i]] = minVertex; } } } visitedInSubGraph [minVertex] = 1; } //add all the remaining edges to the final array of roads for (int i = 0; i < subGraphPoints.Count; i++) { if (newEdges [subGraphPoints [i]] != new Vector3(-1f, -1f, -1f)) { List <Vector3> edge = new List <Vector3> (); edge.Add(subGraphPoints [i]); edge.Add(newEdges[subGraphPoints[i]]); edges.Add(edge); } } // at all the edges place roads prefabs. for (int i = 0; i < edges.Count; i++) { Vector3 midpoint = (edges[i][0] + edges[i][1]) / 2f; GameObject road; road = (GameObject)Instantiate(Resources.Load("preFabs/cubePrefab")); road.transform.position = midpoint; road.transform.LookAt(edges[i][1]); float r = UnityEngine.Random.Range(0.1f, 0.7f); road.transform.localScale = new Vector3(r, 0.1f, Vector3.Distance(edges[i][0], edges[i][1])); road.name = "road_" + i.ToString(); roads.Add(road); } }
public void placeRoads() { Debug.Log("dfs start"); //do a dfs procedure to ensure that every road sub-graph is connected to every other. dfs DFS = new dfs(); DFS.initialise(); subGraphPoints = DFS.dfsUtil(); Debug.Log(subGraphPoints.Count); Debug.Log("dfs end"); Dictionary <Vector3, int> visitedInSubGraph = new Dictionary <Vector3, int> (); Dictionary <Vector3, Vector3> newEdges = new Dictionary <Vector3, Vector3>(); for (int i = 0; i < subGraphPoints.Count; i++) { visitedInSubGraph.Add(subGraphPoints[i], 0); newEdges.Add(subGraphPoints[i], new Vector3(-1f, -1f, -1f)); } for (int i = 0; i < subGraphPoints.Count; i++) { float minimum = 10000f; visitedInSubGraph [subGraphPoints [i]] = 1; Vector3 minVertex = new Vector3(); for (int j = 0; j < subGraphPoints.Count; j++) { if (j != i && visitedInSubGraph[subGraphPoints[j]] != 1) { float distance = Vector3.Distance(subGraphPoints[i], subGraphPoints[j]); if (distance < minimum) { minimum = distance; minVertex = subGraphPoints [j]; newEdges [subGraphPoints [i]] = minVertex; } } } visitedInSubGraph [minVertex] = 1; } for (int i = 0; i < subGraphPoints.Count; i++) { if (newEdges [subGraphPoints [i]] != new Vector3(-1f, -1f, -1f)) { List <Vector3> temp = new List <Vector3> (); temp.Add(subGraphPoints [i]); temp.Add(newEdges[subGraphPoints[i]]); edges.Add(temp); } } for (int i = 0; i < edges.Count; i++) { Vector3 midpoint = (edges[i][0] + edges[i][1]) / 2f; GameObject road; road = (GameObject)Instantiate(Resources.Load("preFabs/cubePrefab")); road.transform.position = midpoint; road.transform.LookAt(edges[i][1]); float r = UnityEngine.Random.Range(0.1f, 0.7f); road.transform.localScale = new Vector3(r, 0.1f, Vector3.Distance(edges[i][0], edges[i][1])); road.name = "road_" + i.ToString(); roads.Add(road); } }