Пример #1
0
        public void Mutate(DnaDrawing drawing)
        {
            if (Tools.WillMutate(Settings.ActiveRedMutationRate))
            {
                Red = Tools.GetRandomNumber(Settings.ActiveRedRangeMin, Settings.ActiveRedRangeMax);
                drawing.SetDirty();
            }

            if (Tools.WillMutate(Settings.ActiveGreenMutationRate))
            {
                Green = Tools.GetRandomNumber(Settings.ActiveGreenRangeMin, Settings.ActiveGreenRangeMax);
                drawing.SetDirty();
            }

            if (Tools.WillMutate(Settings.ActiveBlueMutationRate))
            {
                Blue = Tools.GetRandomNumber(Settings.ActiveBlueRangeMin, Settings.ActiveBlueRangeMax);
                drawing.SetDirty();
            }

            if (Tools.WillMutate(Settings.ActiveAlphaMutationRate))
            {
                Alpha = Tools.GetRandomNumber(Settings.ActiveAlphaRangeMin, Settings.ActiveAlphaRangeMax);
                drawing.SetDirty();
            }
        }
        public double GetDrawingFitness(DnaDrawing newDrawing)
        {
            double error = 0;

            Renderer.Render(newDrawing, _g, 1);

            BitmapData bd = _bmp.LockBits(
                new Rectangle(0, 0, newDrawing.Width, newDrawing.Height),
                ImageLockMode.ReadOnly,
                PixelFormat.Format32bppArgb);

            unchecked
            {
                unsafe
                {
                    fixed (Pixel* psourcePixels = _sourceImagePixels)
                    {
                        Pixel* p1 = (Pixel*)bd.Scan0.ToPointer();
                        Pixel* p2 = psourcePixels;
                        for (int i = _sourceImagePixels.Length; i > 0; i--, p1++, p2++)
                        {
                            int r = p1->R - p2->R;
                            int g = p1->G - p2->G;
                            int b = p1->B - p2->B;
                            error += r * r + g * g + b * b;
                        }
                    }
                }
            }
            _bmp.UnlockBits(bd);

            return error;
        }
        public double GetDrawingFitness(DnaDrawing newDrawing)
        {
            double error = 0;

            using (var b = new Bitmap(newDrawing.Width, newDrawing.Height, PixelFormat.Format24bppRgb))
            using (Graphics g = Graphics.FromImage(b))
            {
                Renderer.Render(newDrawing, g, 1);

                BitmapData bmd1 = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly,
                                             PixelFormat.Format24bppRgb);

                for (int y = 0; y < b.Height; y++)
                {
                    for (int x = 0; x < b.Width; x++)
                    {
                        Color c1 = GetPixel(bmd1, x, y);
                        Color c2 = _sourceColors[x, y];

                        double pixelError = GetColorFitness(c1, c2);
                        error += pixelError;
                    }
                }

                b.UnlockBits(bmd1);
            }

            return error;
        }
Пример #4
0
        //Render a Drawing
        public static void Render(DnaDrawing drawing,Graphics g,int scale)
        {
            g.Clear(Color.Black);

            foreach (DnaPolygon polygon in drawing.Polygons)
                Render(polygon, g, scale);
        }
Пример #5
0
 public static DnaDrawing GetRandom(int width, int height)
 {
     var drawing = new DnaDrawing(width, height);
     for (int i = 0; i < Settings.ActivePolygonsMin; i++)
     {
         drawing.AddPolygon();
     }
     return drawing;
 }
Пример #6
0
        public static DnaDrawing GetRandom(int width, int height)
        {
            var drawing = new DnaDrawing(width, height);

            for (int i = 0; i < Settings.ActivePolygonsMin; i++)
            {
                drawing.AddPolygon();
            }
            return(drawing);
        }
Пример #7
0
        override public void Mutate(DnaDrawing drawing)
        {
            if (tool.WillMutate(Settings.ActiveCircleWidthMutationRate))
            {
                rx = ry = mutateScalar(rx, 0, Settings.ActiveMaxCircleRadius, drawing);
            }

            Brush.Mutate(drawing);

            MutateOrigin(drawing);
        }
Пример #8
0
        private void OpenDNA()
        {
            _evolutionEngine.Stop();

            string openFileName = FileUtil.GetOpenFileName(FileUtil.DnaExtension);
            if (_evolutionEngine.OpenDNA(openFileName))
            {
                guiDrawing = _evolutionEngine.GetGuiDrawing();
                pnlCanvas.Invalidate();
                lastRepaint = DateTime.Now;
            }
        }
Пример #9
0
        public DnaDrawing Clone()
        {
            var drawing = new DnaDrawing();

            drawing.Polygons = new List <DnaPolygon>();
            foreach (DnaPolygon polygon in Polygons)
            {
                drawing.Polygons.Add(polygon.Clone());
            }

            return(drawing);
        }
Пример #10
0
        private void RemovePoint(DnaDrawing drawing)
        {
            if (Points.Count > Settings.ActivePointsPerPolygonMin)
            {
                if (drawing.PointCount > Settings.ActivePointsMin)
                {
                    int index = Tools.GetRandomNumber(0, Points.Count);
                    Points.RemoveAt(index);

                    drawing.SetDirty();
                }
            }
        }
Пример #11
0
        public void Mutate(DnaDrawing drawing)
        {
            if (Tools.WillMutate(Settings.ActiveAddPointMutationRate))
            {
                AddPoint(drawing);
            }

            if (Tools.WillMutate(Settings.ActiveRemovePointMutationRate))
            {
                RemovePoint(drawing);
            }

            Brush.Mutate(drawing);
            Points.ForEach(p => p.Mutate(drawing));
        }
Пример #12
0
        public void MutateOrigin(DnaDrawing drawing)
        {
            if (tool.WillMutate(Settings.ActiveMovePointMaxMutationRate))
            {
                origin.X = tool.GetRandomNumber(-Settings.ActiveMaxCircleRadius, Tools.MaxWidth + Settings.ActiveMaxCircleRadius);
                origin.Y = tool.GetRandomNumber(-Settings.ActiveMaxCircleRadius, Tools.MaxHeight + Settings.ActiveMaxCircleRadius);
                drawing.SetDirty();
            }

            if (tool.WillMutate(Settings.ActiveMovePointMidMutationRate))
            {
                origin.X =
                    Math.Min(
                        Math.Max(-Settings.ActiveMaxCircleRadius,
                                 origin.X +
                                 tool.GetRandomNumber(-Settings.ActiveMovePointRangeMid,
                                                      Settings.ActiveMovePointRangeMid)), Tools.MaxWidth + Settings.ActiveMaxCircleRadius);
                origin.Y =
                    Math.Min(
                        Math.Max(-Settings.ActiveMaxCircleRadius,
                                 origin.Y +
                                 tool.GetRandomNumber(-Settings.ActiveMovePointRangeMid,
                                                      Settings.ActiveMovePointRangeMid)), Tools.MaxHeight + Settings.ActiveMaxCircleRadius);
                drawing.SetDirty();
            }

            if (tool.WillMutate(Settings.ActiveMovePointMinMutationRate))
            {
                origin.X =
                    Math.Min(
                        Math.Max(-Settings.ActiveMaxCircleRadius,
                                 origin.X +
                                 tool.GetRandomNumber(-Settings.ActiveMovePointRangeMin,
                                                      Settings.ActiveMovePointRangeMin)), Tools.MaxWidth + Settings.ActiveMaxCircleRadius);
                origin.Y =
                    Math.Min(
                        Math.Max(-Settings.ActiveMaxCircleRadius,
                                 origin.Y +
                                 tool.GetRandomNumber(-Settings.ActiveMovePointRangeMin,
                                                      Settings.ActiveMovePointRangeMin)), Tools.MaxHeight + Settings.ActiveMaxCircleRadius);
                drawing.SetDirty();
            }
        }
Пример #13
0
        public void Mutate(DnaDrawing drawing)
        {
            if (Tools.WillMutate(Settings.ActiveMovePointMaxMutationRate))
            {
                X = Tools.GetRandomNumber(0, Tools.MaxWidth);
                Y = Tools.GetRandomNumber(0, Tools.MaxHeight);
                drawing.SetDirty();
            }

            if (Tools.WillMutate(Settings.ActiveMovePointMidMutationRate))
            {
                X =
                    Math.Min(
                        Math.Max(0,
                                 X +
                                 Tools.GetRandomNumber(-Settings.ActiveMovePointRangeMid,
                                                       Settings.ActiveMovePointRangeMid)), Tools.MaxWidth);
                Y =
                    Math.Min(
                        Math.Max(0,
                                 Y +
                                 Tools.GetRandomNumber(-Settings.ActiveMovePointRangeMid,
                                                       Settings.ActiveMovePointRangeMid)), Tools.MaxHeight);
                drawing.SetDirty();
            }

            if (Tools.WillMutate(Settings.ActiveMovePointMinMutationRate))
            {
                X =
                    Math.Min(
                        Math.Max(0,
                                 X +
                                 Tools.GetRandomNumber(-Settings.ActiveMovePointRangeMin,
                                                       Settings.ActiveMovePointRangeMin)), Tools.MaxWidth);
                Y =
                    Math.Min(
                        Math.Max(0,
                                 Y +
                                 Tools.GetRandomNumber(-Settings.ActiveMovePointRangeMin,
                                                       Settings.ActiveMovePointRangeMin)), Tools.MaxHeight);
                drawing.SetDirty();
            }
        }
Пример #14
0
        public double mutateScalar(double scalar, double min, double max, DnaDrawing drawing)
        {
            if (tool.WillMutate(Settings.ActiveCircleSizeMidMutationRate))
            {
                drawing.SetDirty();
                return(Math.Min(Math.Max(min, scalar +
                                         tool.GetRandomNumber(-Settings.ActiveCircleSizeRangeMid,
                                                              Settings.ActiveCircleSizeRangeMid)), max));
            }

            if (tool.WillMutate(Settings.ActiveCircleSizeMinMutationRate))
            {
                drawing.SetDirty();
                return(Math.Min(Math.Max(min, scalar +
                                         tool.GetRandomNumber(-Settings.ActiveCircleSizeRangeMin,
                                                              Settings.ActiveCircleSizeRangeMin)), max));
            }

            return(scalar);
        }
Пример #15
0
        virtual public void Mutate(DnaDrawing drawing)
        {
            Console.WriteLine("Mutating Ellipse");
            if (tool.WillMutate(Settings.ActiveCircleWidthMutationRate))
            {
                rx = mutateScalar(rx, 0, Settings.ActiveMaxCircleRadius, drawing);
            }

            if (tool.WillMutate(Settings.ActiveCircleHeightMutationRate))
            {
                ry = mutateScalar(ry, 0, Settings.ActiveMaxCircleRadius, drawing);
            }

            if (tool.WillMutate(Settings.ActiveRotationMutationRate))
            {
                rotation = mutateScalar(rotation, -999.0, 999.0, drawing);
            }

            Brush.Mutate(drawing);

            MutateOrigin(drawing);
        }
Пример #16
0
        private void AddPoint(DnaDrawing drawing)
        {
            if (Points.Count < Settings.ActivePointsPerPolygonMax)
            {
                if (drawing.PointCount < Settings.ActivePointsMax)
                {
                    var newPoint = new DnaPoint();

                    int index = Tools.GetRandomNumber(1, Points.Count - 1);

                    DnaPoint prev = Points[index - 1];
                    DnaPoint next = Points[index];

                    newPoint.X = (prev.X + next.X) / 2;
                    newPoint.Y = (prev.Y + next.Y) / 2;


                    Points.Insert(index, newPoint);

                    drawing.SetDirty();
                }
            }
        }
Пример #17
0
        new public void Mutate(DnaDrawing drawing)
        {
            Brush.Mutate(drawing);

            MutateOrigin(drawing);
        }
        public bool OpenDNA(string openFileName)
        {
            Stop();

            DnaDrawing drawing = Serializer.DeserializeDnaDrawing(openFileName);
            if (drawing != null)
            {
                if (_currentDrawing == null)
                {
                    _currentDrawing = drawing;
                }
                else
                {
                    lock (_currentDrawing)
                    {
                        _currentDrawing = drawing;
                    }
                }
                return true;
            }
            return false;
        }
        private void StartEvolution()
        {
            if (_currentDrawing == null)
                _currentDrawing = GetNewInitializedDrawing(_sourceBitmap.Width, _sourceBitmap.Height);

            while (IsRunning)
            {
                DnaDrawing newDrawing;
                lock (_currentDrawing)
                {
                    newDrawing = _currentDrawing.Clone();
                }
                newDrawing.Mutate();

                _candidates++;

                if (newDrawing.IsDirty)
                {
                    _generation++;

                    double newErrorLevel = _fitnessCalculator.GetDrawingFitness(newDrawing);

                    if (newErrorLevel <= _errorLevel)
                    {
                        _selected++;
                        lock (_currentDrawing)
                        {
                            _currentDrawing = newDrawing;
                        }
                        _errorLevel = newErrorLevel;

                        Console.WriteLine("{0} {1} {2}",
                                          _selected,
                                          _generation,
                                          _errorLevel);
                    }
                }
                //else, discard new drawing
            }
        }
Пример #20
0
        private void tmrRedraw_Tick(object sender, EventArgs e)
        {
            //            if (_evolutionEngine.CurrentDrawing == null)
            //                return;

            var stats = _evolutionEngine.CalculateStatistics();

            toolStripStatusLabelFitness.Text = stats.ErrorLevel.ToString();
            toolStripStatusLabelGeneration.Text = stats.Generation.ToString();
            toolStripStatusLabelSelected.Text = stats.Selected.ToString();
            toolStripStatusLabelPoints.Text = stats.NumPoints.ToString();
            toolStripStatusLabelPolygons.Text = stats.NumPolygons.ToString();
            toolStripStatusLabelAvgPoints.Text = string.Format("{0:0.00}", stats.AveragePointsPerPolygon);

            bool shouldRepaint = false;
            if (repaintIntervall.Ticks > 0)
                if (lastRepaint < DateTime.Now - repaintIntervall)
                    shouldRepaint = true;

            if (repaintOnSelectedSteps > 0)
                if (lastSelected + repaintOnSelectedSteps < stats.Selected)
                    shouldRepaint = true;

            if (shouldRepaint)
            {
                guiDrawing = _evolutionEngine.GetGuiDrawing();
                pnlCanvas.Invalidate();
                lastRepaint = DateTime.Now;
                lastSelected = stats.Selected;
            }
        }
Пример #21
0
        public static void SerializeBinary(DnaDrawing drawing, string fileName)
        {
            if (fileName == null)
                return;

            try
            {
                var formatter = new BinaryFormatter();
                using (var writer = new FileStream(fileName, FileMode.Create))
                {
                    formatter.Serialize(writer, drawing);
                }
            }
            catch
            {
                // do nothing
            }
        }
Пример #22
0
        public static void Serialize(DnaDrawing drawing, string fileName)
        {
            if (fileName == null)
                return;

            if (fileName.EndsWith("xml"))
            {
                try
                {
                    var serializer = new XmlSerializer(drawing.GetType());
                    using (var writer = new FileStream(fileName, FileMode.Create))
                    {
                        serializer.Serialize(writer, drawing);
                    }
                }
                catch
                {
                    // do nothing
                }
            }
            else
            {
                SerializeBinary(drawing, fileName);
            }
        }