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