/// <summary> /// Returning a brush based on a value /// </summary> /// <param name="z">Actual value</param> /// <param name="zmin">Minimum</param> /// <param name="zmax">Maximum</param> /// <param name="cm">A colormap object</param> /// <returns></returns> public static SolidColorBrush GetBrush(double z, double zmin, double zmax, ColormapBrush cm, double opacity = 1) { SolidColorBrush brush = new SolidColorBrush(); int colorIndex = (int)(((cm.Ydivisions - 1) * (z - zmin) + zmax - z) / (zmax - zmin)); if (colorIndex < 0) { colorIndex = 0; } if (colorIndex >= cm.Ydivisions) { colorIndex = cm.Ydivisions - 1; } if (cm.ColormapBrushes == null || cm.ColormapBrushes.Count == 0) { cm.CalculateColormapBrushes(opacity); } brush = (SolidColorBrush)cm.ColormapBrushes[colorIndex].Brush; brush.Freeze(); return(brush); }
public static Bitmap ToBitmap(this double[,] array, ColormapBrush ColorMap) { int width = array.GetLength(1); int height = array.GetLength(0); System.Drawing.Bitmap Image = new System.Drawing.Bitmap(width, height); System.Drawing.Imaging.BitmapData bitmapData = Image.LockBits( new System.Drawing.Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb ); //Iterating over height for (int j = 0; j < height; j++) { //Iterating over width for (int k = 0; k < width; k++) { try { System.Windows.Media.Brush br = ColorMapHelper.GetBrush((double)array[j, k], ColorMap.Ymin, ColorMap.Ymax, ColorMap); byte a = ((Color)br.GetValue(System.Windows.Media.SolidColorBrush.ColorProperty)).A; byte g = ((Color)br.GetValue(System.Windows.Media.SolidColorBrush.ColorProperty)).G; byte r = ((Color)br.GetValue(System.Windows.Media.SolidColorBrush.ColorProperty)).R; byte b = ((Color)br.GetValue(System.Windows.Media.SolidColorBrush.ColorProperty)).B; Image.SetPixel(k, j, System.Drawing.Color.FromArgb(a, r, g, b)); } catch { continue; } } } return(Image); }
/// <summary> /// Add a 3D line to a chart canvas /// </summary> /// <param name="cs"></param> public async Task <List <UIElement> > AddLine3D(LineSeries3D ls, ColormapBrush cm, CancellationToken token) { List <UIElement> symbols = new List <UIElement>(); await Application.Current.Dispatcher.InvokeAsync(async() => { var pLine = new Polyline(); Matrix3D m = Chart3DHelper.AzimuthElevation(Elevation, Azimuth); Point3D[] pts = new Point3D[ls.LinePoints.Count]; int stepWidth = 1; if (ls.LinePoints.Count > 20000) { stepWidth = (ls.LinePoints.Count / 20000); } for (int i = 0; i < ls.LinePoints.Count; i += stepWidth) { if (token.IsCancellationRequested) { break; } if (i == 0) { Console.WriteLine("1:" + DateTime.Now); } await Task.Delay(1); if (ls.LinePoints[i].Item1.X <Xmin || ls.LinePoints[i].Item1.X> Xmax || ls.LinePoints[i].Item1.Y <Ymin || ls.LinePoints[i].Item1.Y> Ymax || ls.LinePoints[i].Item1.Z <Zmin || ls.LinePoints[i].Item1.Z> Zmax) { continue; } try { if (i == 0) { Console.WriteLine("2:" + DateTime.Now); } pts[i] = Normalize3D(m, ls.LinePoints[i].Item1); pLine.Points.Add(new Point(pts[i].X, pts[i].Y)); if (i == 0) { Console.WriteLine("3:" + DateTime.Now); } if (!IsBubbleChart) { if (ls.Symbols.SymbolType != SymbolTypeEnum.None) { ls.Symbols.AddSymbol(ChartCanvas, new Point(pts[i].X, pts[i].Y)); } } else if (ls.Symbols.SymbolType != SymbolTypeEnum.None) { ls.Symbols.FillColor = ColorMapHelper.GetBrush(ls.LinePoints[i].Item2, cm.Ymin, cm.Ymax, cm); symbols.AddRange(ls.Symbols.GetSymbol(new Point(pts[i].X, pts[i].Y))); } } catch { continue; } if (i == 0) { Console.WriteLine("4:" + DateTime.Now); } } if (!IsBubbleChart) { SetLinePattern(ls, pLine); symbols.Add(pLine); } }).Result; return(symbols); }
private async Task ResizeChart() { cts = new CancellationTokenSource(); var token = cts.Token; CommandHelper ch = new CommandHelper(); await ch.RunBackgroundWorkerWithFlagHelperAsync(() => IsDrawing, async() => { //Filtering data based on the selection try { await this.Dispatcher.InvokeAsync(async() => { int count = 0; count = chartCanvas.Children.Count; chartCanvas.Children.RemoveRange(0, chartCanvas.Children.Count); cs.SetChartStyle(); var dc = new BindableCollection <LineSeries3D>(DataCollection); if (dc != null) { if (dc.Count > 0) { symbols.Clear(); ColormapBrush cm = new ColormapBrush(ColorMap); for (int i = 0; i < dc.Count; i++) { try { var symbolCollection = await cs.AddLine3D(dc[i], cm, token).ConfigureAwait(false); symbols.AddRange(symbolCollection); } catch { } } foreach (UIElement x in symbols) { if (!cts.IsCancellationRequested) { try { await Task.Delay(1); this.Dispatcher.Invoke(() => chartCanvas.Children.Add(x)); } catch { continue; } } else { symbols.Clear(); break; } } this.Dispatcher.Invoke(() => { if (IsBubble) { lg.AddColorBar(chartCanvas, cm); } }); } } }); } catch { } finally { } }); }