private void GlobalGoals(RoadSegment segment) { if (segment.EndSegment) { return; } globalGoalsRoads.Clear(); //Generate in the 3 other possible direction var dirVector = segment.getDirVector(); var normalVector1 = new Vector2(dirVector.y, -dirVector.x); var normalVector2 = new Vector2(-dirVector.y, dirVector.x); RoadSegment branchedSegment1 = CalcNewRoadSegment(segment.NodeTo, dirVector, 0); RoadSegment branchedSegment2 = CalcNewRoadSegment(segment.NodeTo, normalVector1, 0); RoadSegment branchedSegment3 = CalcNewRoadSegment(segment.NodeTo, normalVector2, 0); globalGoalsRoads.Add(branchedSegment1); globalGoalsRoads.Add(branchedSegment2); globalGoalsRoads.Add(branchedSegment3); foreach (RoadSegment newSegment in globalGoalsRoads) { queue.Add(newSegment); } }
private RoadSegment GetContinuingRoadSegment(RoadSegment segment) { var dirVector = segment.getDirVector(); if (maxLean < 1) { return(CalcNewRoadSegment(segment.NodeTo, dirVector, 0)); } if (segment.LeanIteration == 3) //Check if we need a new lean. If yes, calculate the next RoadSegment { var randomNumber = rand.Next(0, 3); if (randomNumber == 1) { dirVector = RotateVector(dirVector, GetRandomAngle(2, maxLean * 2)); RoadSegment newSegment = CalcNewRoadSegment(segment.NodeTo, dirVector, 0); newSegment.LeanLeft = true; return(newSegment); } else if (randomNumber == 2) { dirVector = RotateVector(dirVector, GetRandomAngle(-2, -maxLean * 2)); RoadSegment newSegment = CalcNewRoadSegment(segment.NodeTo, dirVector, 0); newSegment.LeanRight = true; return(newSegment); } else { return(CalcNewRoadSegment(segment.NodeTo, dirVector, 0)); } } else //if not, grow the new segment following the lean { if (segment.LeanLeft) { dirVector = RotateVector(dirVector, GetRandomAngle(2, maxLean)); RoadSegment segment1 = CalcNewRoadSegment(segment.NodeTo, dirVector, segment.LeanIteration + 1); segment1.LeanLeft = true; return(segment1); } else if (segment.LeanRight) { dirVector = RotateVector(dirVector, GetRandomAngle(-2, -maxLean)); RoadSegment segment1 = CalcNewRoadSegment(segment.NodeTo, dirVector, segment.LeanIteration + 1); segment1.LeanRight = true; return(segment1); } else { return(CalcNewRoadSegment(segment.NodeTo, dirVector, segment.LeanIteration + 1)); } } }
private void GlobalGoals(RoadSegment segment) { if (segment.EndSegment) { return; } globalGoalsRoads.Clear(); var dirVector = segment.getDirVector(); //BRANCHING int branchRandom = rand.Next(0, 40); //Branching chance is 3 out of 40 if (branchRandom == 4) //At every 40th points approx. the road branches out to the RIGHT { var normalVector = new Vector2(dirVector.y, -dirVector.x); RoadSegment branchedSegment = CalcNewRoadSegment(segment.NodeTo, normalVector, 0); globalGoalsRoads.Add(branchedSegment); } else if (branchRandom == 5) //At every other 40th points approx. the road branches out to the LEFT { var normalVector = new Vector2(-dirVector.y, dirVector.x); RoadSegment branchedSegment = CalcNewRoadSegment(segment.NodeTo, normalVector, 0); globalGoalsRoads.Add(branchedSegment); } else if (branchRandom == 6) //At every another 40th points approx. the road branches out to BOTH DIRECTIONS { var normalVector1 = new Vector2(dirVector.y, -dirVector.x); var normalVector2 = new Vector2(-dirVector.y, dirVector.x); RoadSegment branchedSegment1 = CalcNewRoadSegment(segment.NodeTo, normalVector1, 0); RoadSegment branchedSegment2 = CalcNewRoadSegment(segment.NodeTo, normalVector2, 0); globalGoalsRoads.Add(branchedSegment1); globalGoalsRoads.Add(branchedSegment2); } //ROAD CONTINUE globalGoalsRoads.Add(GetContinuingRoadSegment(segment)); foreach (RoadSegment newSegment in globalGoalsRoads) { queue.Add(newSegment); } }