コード例 #1
0
ファイル: ForGraphics.cs プロジェクト: greencutie/RiskProgram
        /// <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));
            }
        }
コード例 #2
0
ファイル: ForGraphics.cs プロジェクト: greencutie/RiskProgram
        /// <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));
            }
        }
コード例 #3
0
 /// <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);
     }
 }
コード例 #4
0
ファイル: ForGraphics.cs プロジェクト: greencutie/RiskProgram
        /// <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);
            }
        }