public static void RasterizeVectorDrawing(Graphics graphics, VectorDrawing vectorDrawing) { foreach (var coloredTriangle in vectorDrawing.Vectors) { FillColoredTriangle(graphics, coloredTriangle); } }
public long CalculateFitness(VectorDrawing vectorDrawing, Bitmap bitmap) { if (ReferenceEquals(null, bitmap)) { return(0L); } var distance = 0L; using (var image = new Bitmap(bitmap.Width, bitmap.Height)) { using (var graphics = Graphics.FromImage(image)) { GraphicsExtensions.RasterizeVectorDrawing(graphics, vectorDrawing); } for (var x = 0; x < bitmap.Width; x++) { for (var y = 0; y < bitmap.Height; y++) { var bitmapColor = bitmap.GetPixel(x, y); var inputColor = image.GetPixel(x, y); distance += Math.Abs(bitmapColor.R - inputColor.R); distance += Math.Abs(bitmapColor.G - inputColor.G); distance += Math.Abs(bitmapColor.B - inputColor.B); } } return(distance); } }
public VectorDrawing Mutate(VectorDrawing drawing, int width, int height) { var count = drawing.Vectors.Count(); var triangles = drawing.Vectors.ToList(); if (count > 1 && random.Next(2) == 0) { triangles.RemoveAt(random.Next(count)); } else { triangles.Add(ColoredTriangleGenetics.Instance.Create(width, height)); } return(new VectorDrawing() { Vectors = triangles }); }
public VectorDrawing Recombine(VectorDrawing drawingA, VectorDrawing drawingB) { var triangles = new List <ColoredTriangle>(); var maxLength = Math.Max(drawingA.Vectors.Count(), drawingB.Vectors.Count()); var minLength = Math.Min(drawingA.Vectors.Count(), drawingB.Vectors.Count()); var aIsBigger = drawingA.Vectors.Count() == maxLength; for (var i = 0; i < maxLength; i++) { if ((i % 2 == 0 && i < minLength) || (i >= minLength && aIsBigger)) { triangles.Add(drawingA.Vectors.ElementAt(i)); } else { triangles.Add(drawingB.Vectors.ElementAt(i)); } } return(new VectorDrawing() { Vectors = triangles }); }