Esempio n. 1
0
    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);
        }
    }
Esempio n. 2
0
    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);
        }
    }