protected virtual CalculatedFractalPart CreateResult( ICalculationSpecification specification, Rectangle <int> rectangleToCalculate, Collection <FractalPath> points) { return(new CalculatedFractalPart(rectangleToCalculate, points)); }
public CalculatedFractalPart CalculatePart( ICalculationSpecification specification, IFractalSettings settings, CancellationToken cancellationToken) { var rectangleToCalculate = ((PointBasedCalculationSpecification)specification).RectangleToCalculate; var algorithm = (IPointBasedFractal)settings.Algorithm; var points = new Collection <FractalPath>(); for (var x = rectangleToCalculate.Left; x <= rectangleToCalculate.Right; x++) { for (var y = rectangleToCalculate.Top; y <= rectangleToCalculate.Bottom; y++) { var value = algorithm.CalculateSinglePoint(x, y, settings); points.Add(new FractalPath(x - rectangleToCalculate.Left, y - rectangleToCalculate.Top, value)); } if (cancellationToken.IsCancellationRequested) { break; } } return(this.CreateResult(specification, rectangleToCalculate, points)); }
protected override CalculatedFractalPart CreateResult( ICalculationSpecification specification, Rectangle <int> rectangleToCalculate, Collection <FractalPath> points) { var destinationRect = ((ScaledPointBasedCalculationSpecification)specification).DesinationRectangle; return(new ScalableFractalPart(rectangleToCalculate, points, destinationRect)); }
public CalculatedFractalPart CalculatePart( ICalculationSpecification specification, IFractalSettings settings, CancellationToken cancellationToken) { var pathBasedSpec = ((PathBasedCalculationSpecification)specification); var algorithm = (IPathBasedFractal)settings.Algorithm; var lines = algorithm.CalculatePaths(pathBasedSpec.InitialPath, settings, cancellationToken); lines = lines.Union(pathBasedSpec.AdditionalOutput); return(new CalculatedFractalPart(new Rectangle <int>(0, 0, settings.ScreenWidth - 1, settings.ScreenHeight - 1), lines)); }
public IEnumerable <ICalculationSpecification> SplitIntoPreviewParts(ICalculationSpecification specification) { return(new[] { specification }); }
public bool CanCalculatePart(ICalculationSpecification specification) { return(specification is PathBasedCalculationSpecification); }
public CalculatingRenderSpecification(ICalculationSpecification calculationSpecification, IFractalSettings settings, IShader shader) : base(settings, shader) { this.CalculationSpecification = calculationSpecification; }
public override IEnumerable <ICalculationSpecification> SplitIntoPreviewParts(ICalculationSpecification specification) { throw new ArgumentException(@"Provided specification is already the result of another split operation", nameof(specification)); }
public override bool CanCalculatePart(ICalculationSpecification specification) { return(specification is ScaledPointBasedCalculationSpecification); }
public IRenderSpecification CreateDefault(ICalculationSpecification calculationSpecification, IFractalSettings settings, IShader shader) { return(new CalculatingRenderSpecification(calculationSpecification, settings, shader)); }
public abstract IEnumerable <ICalculationSpecification> SplitIntoPreviewParts(ICalculationSpecification specification);
public abstract bool CanCalculatePart(ICalculationSpecification specification);
public override IEnumerable <ICalculationSpecification> SplitIntoPreviewParts(ICalculationSpecification specification) { var originalRectangle = ((PointBasedCalculationSpecification)specification).RectangleToCalculate; var order = ColumnCalculationOrder.GetDefault(originalRectangle.Left, originalRectangle.Right).ToArray(); var stages = order.GroupBy((o => o.Level)).ToArray(); var firstStageWithNoPreviewColumns = stages.FirstOrDefault(s => s.Any(c => c.Size < this.minimimSizeForPreview)); foreach (var stage in stages) { if (stage == firstStageWithNoPreviewColumns) { // columns in this stage are too small, hence ignore all further child stages (no more previews) foreach (var column in stage) { var rect = new Rectangle <int>(column.Left, originalRectangle.Top, column.Right, originalRectangle.Bottom); yield return(new PointBasedCalculationSpecification(rect, stage.Key)); } yield break; } foreach (var column in stage) { var calculationRect = new Rectangle <int>(column.X, originalRectangle.Top, column.X, originalRectangle.Bottom); var targetRect = new Rectangle <int>(column.Left, originalRectangle.Top, column.Right, originalRectangle.Bottom); yield return(new ScaledPointBasedCalculationSpecification(calculationRect, stage.Key, targetRect)); } } }