Beispiel #1
0
        public void Run(ILSystem lSystem, IDrawContext drawCtx, int generation, string rule, ref GenerationState genState)
        {
            if (rule == "F" || rule == "")
            {
                genState.time -= this.Cost;
                this.segments++;

                //if (draw && genState.time >= 0)
                if (genState.time >= 0)
                {
                    genState.length = Math.Min(genState.length, genState.length * genState.time);

                    var state = drawCtx.CurrentState;
                    var p1    = state.Translation;

                    drawCtx.Translate(this.SegmentAxis * genState.length);

                    var p2 = state.Translation;

                    if (lSystem.Timed)
                    {
                        this.Segment.Segment(p1, p2, generation, genState.time, this.segments);
                    }
                    else
                    {
                        this.Segment.Segment(p1, p2, generation, -1, this.segments);
                    }
                }
            }
        }
Beispiel #2
0
 public Plant(ILSystem lindenMayerSystem, TurtlePen turtlePen, PersistentPlantGeometryStorage geometryStorage, Vector3 position, Color leafColour)
 {
     LindenMayerSystem = lindenMayerSystem;
     _turtlePen        = turtlePen;
     GeometryStorage   = geometryStorage;
     Position          = position;
     LindenMayerSystem.SetLeafColour(leafColour);
 }
Beispiel #3
0
        public void Run(ILSystem lSystem, IDrawContext drawCtx, int generation, string c, ref GenerationState genState)
        {
            // Standard command symbols:
            // f signifies a move,
            // + and - rotate either left or right, | rotates 180 degrees,
            // [ and ] are for push() and pop(), e.g. offshoot branches,
            // < and > decrease or increases the segment length,
            // ( and ) decrease or increases the rotation angle.
            if (c == "f")
            {
                drawCtx.Translate(this.SegmentAxis * -Math.Min(genState.length, genState.length * genState.time));
            }
            else if (c == "-")
            {
                drawCtx.Rotate(this.AngleAxis, Math.Min(+genState.angle, +genState.angle * genState.time));
            }
            else if (c == "+")
            {
                drawCtx.Rotate(this.AngleAxis, Math.Max(-genState.angle, -genState.angle * genState.time));
            }
            else if (c == "|")
            {
                drawCtx.Rotate(this.AngleAxis, 180f);
            }
            else if (c == "[")
            {
                drawCtx.Push();
            }
            else if (c == "]")
            {
                drawCtx.Pop();
            }

            // Non-drawing constants
            else if (c == "!")
            {
                genState.angle -= genState.angle;
            }
            else if (c == "(")
            {
                genState.angle *= 1.1f;
            }
            else if (c == ")")
            {
                genState.angle *= 0.9f;
            }
            else if (c == "<")
            {
                genState.length *= 0.9f;
            }
            else if (c == ">")
            {
                genState.length *= 1.1f;
            }
        }
Beispiel #4
0
        public List <ILSystem> ChooseParents(List <Tuple <ILSystem, float> > plantsAndFitness)
        {
            ILSystem firstParent  = RouletteWheelChoice(plantsAndFitness);
            ILSystem secondParent = RouletteWheelChoice(plantsAndFitness.Where(x => x.First != firstParent).ToList());

            return(new List <ILSystem>
            {
                firstParent,
                secondParent
            });
        }
Beispiel #5
0
        public void StartGeneticAlgorithm()
        {
            _iterations   = 0;
            _currentPlant = 0;
            _finalRender  = false;
            if (_iterationText != null)
            {
                _iterationText.text = "Iterations: " + _iterations;
            }

            System.Random    randomGenerator            = new System.Random();
            LSystemGenerator lindenMayerSystemGenerator = LSystemGenerator.Instance();
            List <Plant>     initialPopulation          = new List <Plant>();

            //List<LSystem> staticLSystemSet = lindenMayerSystemGenerator.GetStaticLSystemSets().ConvertAll(x => new LSystem(x.GetRuleSet(), "A"));
            for (int i = 0; i < 50; ++i)
            {
                //ILSystem randomLSystem = staticLSystemSet[i];
                ILSystem randomLSystem = lindenMayerSystemGenerator.GenerateRandomLSystem();
                initialPopulation.Add(new Plant(randomLSystem, _fakeTurtlePen, new PersistentPlantGeometryStorage(), Vector3.zero, new Color((float)randomGenerator.NextDouble(), (float)randomGenerator.NextDouble(), (float)randomGenerator.NextDouble())));
            }

            _plants = initialPopulation;
        }