public void Iterate(int numIters, IProgress <double> progress = null) { if (numIters < 1) { return; } int numElem = _cells.GetLength(0); int interval = numElem / 100; int done = 0; Parallel.For(0, SizeX, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, x => { for (int y = 0; y < SizeY; y++) { var cell = _cells[x, y]; if (!cell.IsEscaped) { int iter = 0; var z = cell.Z; var c = cell.C; bool escaped = false; while (iter < numIters) { z = _iterationFunction(z + ZOffset, c, Power); iter++; if (CheckIsEscaped(z)) { escaped = true; break; } } _cells[x, y] = new MandelbrotCellInfo { Z = z, C = c, Iterations = cell.Iterations + iter, IsEscaped = escaped }; } } if (progress != null) { int d = System.Threading.Interlocked.Add(ref done, 1); if (d % interval == 0) { progress.Report(0.01); } } }); TotalIterations += numIters; }
private void ReinitializeMandelbrot( int sizeX, int sizeY, MandelFunction mandelFunctionType, Complex power, double escapeRadius, Complex center, double range, Complex zOffset) { TotalIterations = 0; bool rebuildArray = _cells == null || SizeX != sizeX || SizeY != sizeY; SizeX = sizeX; SizeY = sizeY; EscapeRadius = escapeRadius; EscapeRadius2 = escapeRadius * escapeRadius; if (rebuildArray) { _cells = new MandelbrotCellInfo[SizeX, SizeY]; } Center = center; Range = range; Power = power; ZOffset = zOffset; double minReal, minImag, rRange, iRange, inc, cr, ci; if (SizeX > SizeY) { rRange = Range; iRange = Range * SizeY / SizeX; minReal = Center.Real - rRange; minImag = Center.Imaginary - iRange; inc = 2 * Range / SizeX; } else { rRange = Range * SizeX / SizeY; iRange = Range; minReal = Center.Real - rRange; minImag = Center.Imaginary - iRange; inc = 2 * Range / SizeY; } MinValue = new Complex(minReal, minImag); MaxValue = new Complex(minReal + 2 * rRange - inc, minImag + 2 * iRange - inc); for (int x = 0; x < SizeX; x++) { cr = minReal + x * inc; for (int y = 0; y < SizeY; y++) { ci = minImag + y * inc; _cells[x, y] = new MandelbrotCellInfo { Z = Complex.Zero, C = new Complex(cr, ci), Iterations = 0, IsEscaped = false }; } } MandelFunctionType = mandelFunctionType; if (!_mandelFunctionInfos.TryGetValue(mandelFunctionType, out MandelFunctionInfo info)) { info = _mandelFunctionInfos[MandelFunction.Mandelbrot]; } _iterationFunction = info.IterationFunction; RealPowerGrowth = info.RealPowerGrowth(power.Real); }