public static Bitmap RenderHighRes(MultislitConfiguration configuration, Size size, ProgressProvider progress) { double[] yBrightnessFactors = MultislitRenderer.CalculateYBrightnessDistribution(configuration, size.Height); using (FastBitmap target = new FastBitmap(size, Color.FromArgb(10, 10, 10))) { int chunkSize = 10; int finishedChunks = 0; double chunkFactor = ((double)chunkSize / size.Width); if (configuration.LightSources.Any()) { Parallel.For(0, (int)Math.Ceiling(size.Width / (double)chunkSize), i => { for (int ix = i * chunkSize; ix < Math.Min(i * chunkSize + chunkSize, size.Width); ix++) { double x = (ix - size.Width * 0.5) / configuration.Scale; RgbColor xColor = configuration.Brightness * MultislitRenderer.CalculateColorAt(configuration, x, 1, 250); for (int iy = 0; iy < size.Height; iy++) { if (target == null || target.IsDisposed) { return; } if (configuration.DisplayDistribution) { target[ix, iy] = xColor; } else { target[ix, iy] = yBrightnessFactors[iy] * xColor; } } } finishedChunks++; progress.Progress = chunkFactor * finishedChunks; }); } return((Bitmap)target.InternalBitmap.Clone()); } }
/// <summary> /// Renders an image of the specified multislit configuration. /// </summary> /// <param name="configuration">The multislit configuration.</param> /// <param name="size">The image size.</param> /// <returns>A rendering of the specified multislit configuration</returns> public static Bitmap Render(MultislitConfiguration configuration, Size size) { return(MultislitRenderer.Render(configuration, size, 1)); }
/// <summary> /// The internal, overridable method in which all of the rendering takes place. /// </summary> /// <returns>The current rendering of the simulation.</returns> protected virtual Bitmap RenderInternal() { return(MultislitRenderer.Render(this.configuration, this.Size, 5)); }