/// <summary> /// Функция для отрисовки 3-го графика (карта соотношений) /// </summary> /// <param name="ds"></param> public void DrawBigPoints(DataSender ds) { mas_point = new List <ColorPoint>(); int maxvx = ds.points[0].X; // ищем максимальное значение по x и y, чтобы понять, какую область надо выделять под график int maxvy = ds.points[0].Y; int maxvr = (int)ds.points[0].r; // ищем максимальный радиус, чтобы относительно него вычислить размер области, на которой рисуется график foreach (var i in ds.points) { maxvx = Math.Max(maxvx, i.X); maxvy = Math.Max(maxvy, i.Y); maxvr = Math.Max(maxvr, (int)i.r); } int wigth = (int)(Math.Max((maxvx + 3 * maxvr), 50) * scale + space * 2); //определяем ширину бимпама int heigth = (int)(Math.Max((maxvy + 3 * maxvr), 50) * scale + space * 2 + space); // определяем высоту бимпама bmp = new Bitmap(wigth, heigth); graph = Graphics.FromImage(bmp); DrawAxis(xs: "Качество системы", ys: "Средневзвешенный риск системы", xe: 1, ye: 1); for (int i = 0; i < ds.points.Count; i++) { string name = ds.points[i].ToString(3, 3); //3 - номер графика (нумерация здесь с 1) mas_point.Add(DrawPoint((int)(ds.points[i].X * scale + space), (int)(bmp.Height - space - (int)(ds.points[i].Y * scale)), (int)(Math.Max(1, ds.points[i].r * scale)), ds.points[i].c, name)); } }
/// <summary> /// Функция для построение 2-го графика (карта рисков) /// </summary> /// <param name="ds"></param> /// <param name="f1"></param> /// <param name="f2"></param> public void DrawPoints(DataSender ds, DataSender.Func f1 = null, DataSender.Func f2 = null) { mas_point = new List <ColorPoint>(); if (f1 == null) { if (ds.f1 != null) { f1 = ds.f1; } else { f1 = delegate(double x) { return(((1.0 / (Math.Max(0, x * 100.0 - 32))) + 32) / 100.0); }; } } if (f2 == null) { if (ds.f2 != null) { f2 = ds.f2; } else { f2 = delegate(double x) { return(((1.0 / (Math.Max(0, x * 100.0 - 70))) + 70) / 100.0); }; } } int maxvx = ds.points[0].X; // ищем максимальное значение по x и y, чтобы понять, какую область надо выделять под график int maxvy = ds.points[0].Y; int maxvr = (int)ds.points[0].r; // ищем максимальный радиус, чтобы относительно него вычислить размер области, на которой рисуется график foreach (var i in ds.points) { maxvx = Math.Max(maxvx, i.X); maxvy = Math.Max(maxvy, i.Y); maxvr = Math.Max(maxvr, (int)i.r); } int wigth = (int)(Math.Max((maxvx + 3 * maxvr), 50) * scale + space * 3); //определяем ширину бимпама int heigth = (int)(Math.Max((maxvy + 3 * maxvr), 50) * scale + space * 3 + space); // определяем высоту бимпама bmp = new Bitmap(wigth, heigth); graph = Graphics.FromImage(bmp); DrawAxis(xs: "Вероятность", ys: "Влияние", xe: 1, ye: 1);// xe: 1, ye: 1 - для отображения 0 и 1 на осях графиков // отрисовка точек for (int i = 0; i < ds.points.Count; i++) { //Color c = Color.Green; // аналогично опредеелнию цвета для графика №1 //if (ds.points[i].y >= f1(ds.points[i].x) && ds.points[i].y < f2(ds.points[i].x)) c = Color.Yellow; //if (ds.points[i].y >= f2(ds.points[i].x)) c = Color.Red; string name = ds.points[i].ToString(3, 2); // 2 - номер графика (нумерация здесь с 1) mas_point.Add(DrawPoint((int)(ds.points[i].X * scale + space * 2), (int)(bmp.Height - space * 2 - (int)(ds.points[i].Y * scale)), (int)(ds.points[i].r), ds.points[i].c, name)); } }
/// <summary> /// конструктор /// </summary> /// <param name="ds"></param> public FormGraphics(DataSender ds, string name = "Graphics", Form own = null) { try { this.ds = ds; this.owner = own; this.Owner = null; DoubleBuffered = true; gr = new ForGraphics(this); InitializeComponent(); Invalidate(); Init(); // задание изначальной позиции верхнего левого угла битмапа this.Focus(); this.Text = name; //this.TopMost = true; // будет всегда поверх остальных окон //this.TopMost = false; // будет поверх остальных окон, но уже не всегда this.MinimumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height / 2); } catch (Exception ex) { //ApplicationClosingByException(ex); } }
/// <summary> /// Функция для рисования гистограммы /// </summary> /// <param name="ds"></param> /// <param name="histogramwigth"></param> /// <param name="spaceingroup"></param> /// <param name="spacebetweengroups"></param> public void DrawHists(DataSender ds, int histogramwigth = 5, int spaceingroup = 2, int spacebetweengroups = 5) { mas_rect = new List <ColorRect>(); List <List <int> > histogram = new List <List <int> >(); // массив, высот столбцов гистограммы приведённый к int int counter = 0; for (int i = 0; i < ds.histogram_h.Count; i++) { histogram.Add(new List <int>()); for (int j = 0; j < ds.histogram_h[i].Count; j++) { histogram[i].Add((int)(Math.Max(1, ds.histogram_h[i][j] * vscale))); counter++; } } int wigth = (int)((((histogramwigth) + (spaceingroup)) * (counter) + (spacebetweengroups - spaceingroup) * (histogram.Count) + spacebetweengroups) * scale + space * 2); List <List <string> > names = ds.histogram_name; // массив, имён столбцов гистограммы // ширина белой области, на которой рисуется график // ищем максимальное значение риска для нахождения высоты белой области, на которой рисуется график int maxv = histogram[0][0]; foreach (var i in histogram) { foreach (var j in i) { maxv = Math.Max(maxv, j); } } int heigth = (int)((((maxv) + 28 / 10.0) * scale + space * 2 + space)); // spaсe - ширина рамки вокруг графика (для надписей) bmp = new Bitmap(wigth, heigth); graph = Graphics.FromImage(bmp); DrawAxis(xs: "Атрибуты", ys: " ", ye: 1); //рисуем оси и создаем белое поле нужного размера // поэтапно рисуем прямоугольники для гистограммы int nowx = (int)(space + (spacebetweengroups) * scale); // нынешняя позиция по оси x for (int i = 0; i < histogram.Count; i++) { for (int j = 0; j < histogram[i].Count; j++) { Color c = Color.Green; // далеее, смотря по высоте прямоугольника, при необходимости поменяем на желтый или красный if (histogram[i][j] >= maxv / 3 && histogram[i][j] < maxv * 2 / 3) { c = Color.Yellow; } if (histogram[i][j] >= maxv * 2 / 3) { c = Color.Red; } mas_rect.Add(DrawRect((int)(nowx), (int)(bmp.Height - space - (int)(histogram[i][j] * scale)), (int)(histogramwigth * scale), (int)(histogram[i][j] * scale), c, names[i][j])); nowx += (int)((histogramwigth + spaceingroup) * scale); } nowx += (int)((spacebetweengroups - spaceingroup) * scale); } nowx = (int)(space + (spacebetweengroups) * scale); // нынешняя позиция по оси x for (int i = 0; i < histogram.Count; i++) { maxv = 0; for (int j = 0; j < histogram[i].Count; j++) { maxv = Math.Max(maxv, histogram[i][j]); } for (int j = 0; j < histogram[i].Count; j++) { Color c = Color.Green; // далеее, смотря по высоте прямоугольника, при необходимости поменяем на желтый или красный if (histogram[i][j] >= maxv / 3 && histogram[i][j] < maxv * 2 / 3) { c = Color.Yellow; } if (histogram[i][j] >= maxv * 2 / 3) { c = Color.Red; } if (j == histogram[i].Count / 2) { DrawRect((int)(nowx), (int)(bmp.Height - space - (int)(maxv * scale + 28)), (int)(histogramwigth * scale), (int)(maxv * scale + 28), c, ds.histogram_attr_name[i], false); } DrawRect((int)(nowx), (int)(bmp.Height - space - (int)(histogram[i][j] * scale)), (int)(histogramwigth * scale), (int)(histogram[i][j] * scale), c, (j + 1).ToString(), false); nowx += (int)((histogramwigth + spaceingroup) * scale); } nowx += (int)((spacebetweengroups - spaceingroup) * scale); } }