Beispiel #1
0
        static void DrawAsciiMandelbrotSet(double x1, double y1, double x2, double y2, double xd, double yd)
        {
            var mandelbrotSolver = new MandelbrotSolver();
            Func<Complex, bool> solver = x => mandelbrotSolver.IsMemberIterative(x).IsMember;

            for (var y = y1; y >= y2; y -= yd)
            {
                for (var x = x1; x <= x2; x += xd)
                {
                    var c = new Complex(x, y);
                    var outputChar = solver(c) ? "#" : ".";
                    Console.Write(outputChar);
                }
                Console.WriteLine();
            }
        }
        private ImageSource DrawMandelbrot(Rect area)
        {
            var pixelHeight = (int)MandelbrotImage.Height;
            var pixelWidth = (int)MandelbrotImage.Width;
            var bitmap = new WriteableBitmap(pixelWidth, pixelHeight, 96, 96, PixelFormats.Bgra32, null);

            var bytesPerPixel = bitmap.Format.BitsPerPixel / 8;
            var pixels = new byte[pixelHeight * pixelWidth * bytesPerPixel];
            var stride = pixelWidth * bytesPerPixel;

            var xScale = (area.Right - area.Left) / pixelWidth;
            var yScale = (area.Top - area.Bottom) / pixelHeight;

            var mandelbrotSolver = new MandelbrotSolver(maxIterations: 50);

            var pixelIndices = Enumerable.Range(0, pixels.Length).Where(i => i % 4 == 0);

            Parallel.ForEach(pixelIndices, i =>
            {
                var yPixel = i / stride;
                var xPixel = i % stride / bytesPerPixel;

                var xCoord = area.Left + xPixel * xScale;
                var yCoord = area.Top - yPixel * yScale;

                var c = new Complex(xCoord, yCoord);

                var mandelbrotResult = mandelbrotSolver.IsMemberIterative(c);

                var colour = IterationColour(mandelbrotResult.Iterations);
                pixels[i] = colour.B;
                pixels[i + 1] = colour.G;
                pixels[i + 2] = colour.R;
                pixels[i + 3] = colour.A;
            });

            var sourceRect = new Int32Rect(0, 0, pixelWidth, pixelHeight);
            bitmap.WritePixels(sourceRect, pixels, stride, 0);
            return bitmap;
        }