Example #1
0
        // Конструктор копирования

        /// <param name="instance"></param>
        public FractalImage(FractalImage instance)
        {
            Height    = instance.Height;
            Width     = instance.Width;
            _stride   = instance._stride;
            BitMap    = instance.BitMap.Clone();
            RawPixels = (byte[])instance.RawPixels.Clone();
            ViewPoint = instance.ViewPoint;
        }
        // Изображение будет разделено на количество сегментов
        // зависящих от количества потоков

        public void GeneratePixels(FractalImage image, long iterations, int segments, string colorIndex)
        {
            // Этот объект заблокирован до тех пор
            // пока не будет досчитан
            lock (this)
            {
                // Внешние состояния
                _colorIndex    = colorIndex;
                _maxIterations = iterations;
                _currentImage  = image;

                // Стандартное количество сегментов зависящее от количества ядер
                if (segments == 0)
                {
                    segments = Environment.ProcessorCount - 1;
                }

                Thread[] _generationThreads = new Thread[segments];

                // Коэффициенты масштаба
                double xfactor = MandelbrotComputation.CalculateXScalar(image);
                double yfactor = MandelbrotComputation.CalculateYScalar(image);

                // Вычисление количества сегментов и пикселей в изображении
                int pixels          = image.RawPixels.Length / image.BytesPixel;
                int pixelsPerthread = pixels / segments;

                // Начало вычисления пикселей в различных потоках
                for (int i = 0; i < segments; i++)
                {
                    int segmentStart = i * pixelsPerthread;
                    int segmentEnd   = segmentStart + pixelsPerthread;
                    _generationThreads[i] = new Thread(() => ProcessSegment(segmentStart, segmentEnd, xfactor, yfactor));
                    _generationThreads[i].Start();
                }

                // Ожидание конца работы потоков
                foreach (var thread in _generationThreads)
                {
                    thread.Join();
                }
            }
        }
Example #3
0
        //  Вычисляются скаляры X и Y для масштабирования изображения

        /// <param name="image"> Изображение, для которого будет вычислен скаляр </param>
        public static double CalculateXScalar(FractalImage image)
        {
            return((image.ViewPoint.Right - image.ViewPoint.Left) / image.Width);
        }
Example #4
0
 public static double CalculateYScalar(FractalImage image)
 {
     return((image.ViewPoint.Top - image.ViewPoint.Bottom) / image.Height);
 }