示例#1
0
        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);
            }
        }
示例#2
0
        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));
                }
            }
        }
示例#3
0
        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);
            }
        }