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}; }