public ImageAndTime DrawMandelbrot(InputArguments arguments)
        {
            var palette = GenerateColorPalette();
            var img     = new CustomBitmap(arguments.Width, arguments.Height);
            // Offset in real numbers to which bits will be moved
            var realScale = (Math.Abs(arguments.Coordinates[0]) + Math.Abs(arguments.Coordinates[1])) / arguments.Width;
            //  Offset in complex numbers to which bits will be moved
            var imaginaryScale = (Math.Abs(arguments.Coordinates[2]) + Math.Abs(arguments.Coordinates[3])) / arguments.Height;

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var rectangle       = new Rectangle(0, 0, img.Bitmap.Width, img.Bitmap.Height);
            var data            = img.Bitmap.LockBits(rectangle, ImageLockMode.ReadWrite, PixelFormat.Format48bppRgb);
            var height          = arguments.Height;
            var width           = arguments.Width;
            var coordinatesF    = arguments.Coordinates[0];
            var coordinatesS    = arguments.Coordinates[2];
            var numberOfThreads = arguments.Threads;

            Parallel.For(0, width, new ParallelOptions {
                MaxDegreeOfParallelism = numberOfThreads
            }, x =>
            {
                for (var y = 0; y < height; y++)
                {
                    //scaling of complex number
                    var c = new Complex(x * realScale + coordinatesF, y * imaginaryScale + coordinatesS);
                    var z = c;
                    foreach (var t in palette)
                    {
                        if (z.Magnitude >= 2.0)
                        {
                            img.SetPixel(x, y, t, data);

                            break;
                        }
                        z = c + Complex.Pow(z, 2);         // Z = Zlast^2 + C
                    }
                }
            });
            img.Bitmap.UnlockBits(data);
            stopwatch.Stop();
            Console.WriteLine(stopwatch.Elapsed);

            return(new ImageAndTime {
                Bitmap = img.Bitmap, TimeForRender = stopwatch.Elapsed
            });
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            var stopWatch = new Stopwatch();
            stopWatch.Start();

            var fractalCreating = new CustomBitmap();
            var argumentsParser = new InputArguments(WidthBox.Text, HeightBox.Text, CoordinatesBox.Text, ThreadsNumBox.Text);

            var drewObject = fractalCreating.DrawMandelbrot(argumentsParser);
            drewObject.Bitmap.Save(ImageNameBox.Text, ImageFormat.Jpeg);
            Image.Source = LoadBitmap(drewObject.Bitmap);
            stopWatch.Stop();

            AllTimeBox.Text = stopWatch.Elapsed.ToString();
            RenderTimeBox.Text = drewObject.TimeForRender.ToString();
        }
        public ImageAndTime DrawMandelbrot(InputArguments arguments)
        {
            var palette = GenerateColorPalette();
                var img = new CustomBitmap(arguments.Width, arguments.Height);
                // Offset in real numbers to which bits will be moved
                var realScale = (Math.Abs(arguments.Coordinates[0]) + Math.Abs(arguments.Coordinates[1])) / arguments.Width;
                //  Offset in complex numbers to which bits will be moved
                var imaginaryScale = (Math.Abs(arguments.Coordinates[2]) + Math.Abs(arguments.Coordinates[3])) / arguments.Height;

                var stopwatch = new Stopwatch();
                stopwatch.Start();

                var rectangle = new Rectangle(0, 0, img.Bitmap.Width, img.Bitmap.Height);
                var data = img.Bitmap.LockBits(rectangle, ImageLockMode.ReadWrite, PixelFormat.Format48bppRgb);
                var height = arguments.Height;
                var width = arguments.Width;
                var coordinatesF = arguments.Coordinates[0];
                var coordinatesS = arguments.Coordinates[2];
                var numberOfThreads = arguments.Threads;

                Parallel.For(0, width, new ParallelOptions { MaxDegreeOfParallelism = numberOfThreads }, x =>
                    {
                        for (var y = 0; y < height; y++)
                        {
                            //scaling of complex number
                            var c = new Complex(x * realScale + coordinatesF, y * imaginaryScale + coordinatesS);
                            var z = c;
                            foreach (var t in palette)
                            {
                                if (z.Magnitude >= 2.0)
                                {

                                    img.SetPixel(x, y, t,data);

                                    break;
                                }
                                z = c + Complex.Pow(z, 2); // Z = Zlast^2 + C
                            }
                        }
                    });
                img.Bitmap.UnlockBits(data);
                stopwatch.Stop();
                Console.WriteLine(stopwatch.Elapsed);

                return new ImageAndTime{Bitmap=img.Bitmap,TimeForRender = stopwatch.Elapsed};
        }
示例#4
0
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var fractalCreating = new CustomBitmap();
            var argumentsParser = new InputArguments(WidthBox.Text, HeightBox.Text, CoordinatesBox.Text, ThreadsNumBox.Text);


            var drewObject = fractalCreating.DrawMandelbrot(argumentsParser);

            drewObject.Bitmap.Save(ImageNameBox.Text, ImageFormat.Jpeg);
            Image.Source = LoadBitmap(drewObject.Bitmap);
            stopWatch.Stop();

            AllTimeBox.Text    = stopWatch.Elapsed.ToString();
            RenderTimeBox.Text = drewObject.TimeForRender.ToString();
        }