// Конструктор копирования /// <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(); } } }
// Вычисляются скаляры X и Y для масштабирования изображения /// <param name="image"> Изображение, для которого будет вычислен скаляр </param> public static double CalculateXScalar(FractalImage image) { return((image.ViewPoint.Right - image.ViewPoint.Left) / image.Width); }
public static double CalculateYScalar(FractalImage image) { return((image.ViewPoint.Top - image.ViewPoint.Bottom) / image.Height); }