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();
        }
Пример #2
0
        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};
        }