//TESTING
    public void test()
    {
        RoadVisualizer.placeRoad(new Edge(new Node(100, 100), new Node(125, 125), RoadTypes.HIGHWAY), "0");
        RoadVisualizer.placeRoad(new Edge(new Node(125, 125), new Node(180, 150), RoadTypes.HIGHWAY), "1");
        RoadVisualizer.placeRoad(PositionLegalizer.legalizeRoad(new Edge(new Node(180, 150), new Node(200, 250), RoadTypes.HIGHWAY)), "2");
        RoadVisualizer.placeRoad(new Edge(new Node(200, 250), new Node(200, 550), RoadTypes.HIGHWAY), "3");
        RoadVisualizer.placeRoad(new Edge(new Node(200, 550), new Node(200, 750), RoadTypes.HIGHWAY), "4");

        RoadVisualizer.placeRoad(new Edge(new Node(125, 125), new Node(125, 175), RoadTypes.STREET), "5");
        RoadVisualizer.placeRoad(new Edge(new Node(125, 175), new Node(80, 225), RoadTypes.STREET), "6");
        RoadVisualizer.placeRoad(new Edge(new Node(125, 175), new Node(180, 150), RoadTypes.STREET), "7");
    }
    public Edge validateRoad(Edge road)
    {
        if (CityGeneratorUI.DebugMode)
        {
            Debug.Log("Localconstraints, checking: " + road);
        }

        // Try to legalize the position
        Edge newRoad = PositionLegalizer.legalizeRoad(road);

        if (newRoad == null)
        {
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Position legalizer could not fix: " + road);
            }
            return(null);
        }
        else
        {
            // Fix intersections
            newRoad = intersectionChecker.fixRoad(newRoad);
            if (newRoad == null)
            {
                if (CityGeneratorUI.DebugMode)
                {
                    Debug.Log("Intersection checker could not fix: " + road);
                }
                return(null);
            }

            //Check if the road has a valid length
            if (!CoordinateHelper.validRoadLength(newRoad))
            {
                if (CityGeneratorUI.DebugMode)
                {
                    Debug.Log("Road was fixed but was not long enough: " + road);
                }
                return(null);
            }
            else
            {
                return(newRoad);
            }
        }
    }
示例#3
0
    //generate the first roads
    public List <Edge> generateFirstRoads(RoadMapGenerator.Approach approach)
    {
        List <Edge>    firstRoads;
        Vector2        peakVector, initialEdgeVector, oppositeEdgeVector;
        Node           peakNode, initialEdgeNode, oppositeEdgeNode;
        Edge           initialEdge, oppositeEdge;
        List <Vector2> densityPeaks = CityGenerator.densityPeaks;

        switch (approach)
        {
        case RoadMapGenerator.Approach.RANDOM:
            Node startNode = null;
            while (startNode == null)
            {
                startNode = new Node(Random.Range(10, CityGenerator.terrainSize - 10), Random.Range(10, CityGenerator.terrainSize - 10));
                if (PositionLegalizer.isNodeUnderWater(startNode))
                {
                    startNode = null;
                }
            }

            firstRoads = new List <Edge> ();

            Vector2 startLocation = new Vector2(startNode.x, startNode.y);
            initialEdgeVector = new Vector2(CityGenerator.highwayMinLength, 0);
            initialEdgeVector = Quaternion.Euler(0, 0, Random.value * 360f) * initialEdgeVector;

            // Generate an opposite edge vector
            oppositeEdgeVector = Quaternion.Euler(0, 0, 180f) * initialEdgeVector;

            // Build initial edge
            initialEdgeVector += startLocation;
            initialEdgeNode    = new Node(initialEdgeVector);
            initialEdge        = new Edge(startNode, initialEdgeNode, RoadTypes.HIGHWAY);
            firstRoads.Add(initialEdge);

            // Build opposite edge
            oppositeEdgeVector += startLocation;
            oppositeEdgeNode    = new Node(oppositeEdgeVector);
            oppositeEdge        = new Edge(startNode, oppositeEdgeNode, RoadTypes.HIGHWAY);
            firstRoads.Add(oppositeEdge);

            return(firstRoads);

        // MASSI APPROACH: a highway per peak
        case RoadMapGenerator.Approach.MASSI:

            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Peaks: " + densityPeaks.Count);
            }

            if (densityPeaks != null)
            {
                firstRoads = new List <Edge> ();

                foreach (Vector2 peakLocation in densityPeaks)
                {
                    peakNode = new Node(peakLocation);

                    initialEdgeVector = new Vector2(CityGenerator.highwayMinLength, 0);
                    initialEdgeVector = Quaternion.Euler(0, 0, Random.value * 360f) * initialEdgeVector;

                    // Generate an opposite edge vector
                    oppositeEdgeVector = Quaternion.Euler(0, 0, 180f) * initialEdgeVector;

                    // Build initial edge
                    initialEdgeVector += peakLocation;
                    initialEdgeNode    = new Node(initialEdgeVector);
                    initialEdge        = new Edge(peakNode, initialEdgeNode, RoadTypes.HIGHWAY);
                    firstRoads.Add(initialEdge);

                    // Build opposite edge
                    oppositeEdgeVector += peakLocation;
                    oppositeEdgeNode    = new Node(oppositeEdgeVector);
                    oppositeEdge        = new Edge(peakNode, oppositeEdgeNode, RoadTypes.HIGHWAY);
                    firstRoads.Add(oppositeEdge);
                }
                return(firstRoads);
            }
            else
            {
                return(null);
            }

        // ROBIN APPROACH: a single highway on one of the peaks
        case RoadMapGenerator.Approach.ROBIN:
            if (CityGeneratorUI.DebugMode)
            {
                Debug.Log("Peaks: " + densityPeaks.Count);
            }

            if (densityPeaks != null)
            {
                firstRoads = new List <Edge> ();

                //take a random peak
                Vector2 randomPeak = densityPeaks [Random.Range(0, densityPeaks.Count)];
                peakNode = new Node(randomPeak);

                initialEdgeVector = new Vector2(CityGenerator.highwayMinLength, 0);
                initialEdgeVector = Quaternion.Euler(0, 0, Random.value * 360f) * initialEdgeVector;
                // Generate an opposite edge vector
                oppositeEdgeVector = -initialEdgeVector;

                // Build initial edge
                initialEdgeVector += randomPeak;
                initialEdgeNode    = new Node(initialEdgeVector);
                initialEdge        = new Edge(peakNode, initialEdgeNode, RoadTypes.HIGHWAY);
                firstRoads.Add(initialEdge);

                // Build opposite edge
                oppositeEdgeVector += randomPeak;
                oppositeEdgeNode    = new Node(oppositeEdgeVector);
                oppositeEdge        = new Edge(peakNode, oppositeEdgeNode, RoadTypes.HIGHWAY);
                firstRoads.Add(oppositeEdge);

                Debug.Log("initial edge: " + initialEdge + " oppositeEdge: " + oppositeEdge);

                return(firstRoads);
            }
            else
            {
                return(null);
            }


        // NEILS' APPROACH: only one highway starting from the first peak
        case RoadMapGenerator.Approach.NIELS:
            firstRoads = new List <Edge>();

            float xCoordinate   = -1f;
            float yCoordinate   = -1f;
            float maxPopulation = float.NegativeInfinity;
            for (int x = 0; x < CoordinateHelper.getTerrainSize().x; x++)
            {
                for (int y = 0; y < CoordinateHelper.getTerrainSize().z; y++)
                {
                    float population = CoordinateHelper.worldToPop(x, y);
                    if (population > maxPopulation)
                    {
                        maxPopulation = population;
                        xCoordinate   = x;
                        yCoordinate   = y;
                    }
                }
            }

            peakVector = new Vector2(xCoordinate, yCoordinate);
            peakNode   = new Node(peakVector);

            // Generate an initial edge vector with config length...
            initialEdgeVector = new Vector2(CityGenerator.highwayMinLength, 0);

            // ... and rotate it randomly
            initialEdgeVector = Quaternion.Euler(0, 0, Random.value * 360f) * initialEdgeVector;

            // Generate an opposite edge vector
            oppositeEdgeVector = Quaternion.Euler(0, 0, 180f) * initialEdgeVector;

            // Build initial edge
            initialEdgeVector += peakVector;
            initialEdgeNode    = new Node(initialEdgeVector);
            initialEdge        = new Edge(peakNode, initialEdgeNode, RoadTypes.HIGHWAY);
            firstRoads.Add(initialEdge);

            // Build opposite edge
            oppositeEdgeVector += peakVector;
            oppositeEdgeNode    = new Node(oppositeEdgeVector);
            oppositeEdge        = new Edge(peakNode, oppositeEdgeNode, RoadTypes.HIGHWAY);
            firstRoads.Add(oppositeEdge);

            return(firstRoads);

        default:
            return(null);
        }
    }