//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); } } }
//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); } }