Вероятности событий графа в C#

Пример Вычислить вероятность события, происходящего в данном количестве испытаний в C# , показывает, как вычислять вероятности событий. Этот пример отображает результаты. Вы можете использовать этот пример, чтобы понять, как изменяются вероятности.

Введите вероятность события и максимальное количество выполненных испытаний. Когда вы нажмете «Go», программа выполнит следующий код.

// Данные вероятности.
private PointF[] Points = {};

// Вычислить и отобразить вероятности.
private void btnGo_Click(object sender, EventArgs e)
{
    // Устранение вероятностей.
    int num_events = int.Parse(txtMaxNumberEvents.Text);
    Points = new PointF[num_events + 1];

    // Получите вероятность события.
    double event_prob =
        double.Parse(txtEventProb.Text.Replace("%", ""));
    if (txtEventProb.Text.Contains("%")) event_prob /= 100.0;

    // Получить вероятность того, что событие не произойдет.
    double non_prob = 1.0 - event_prob;

    for (int i = 0; i <= num_events; i++)
    {
        Points[i].X = i;
        Points[i].Y = 100 * (float)(1.0 - Math.Pow(non_prob, i));
    }

    // Перерисовать.
    picGraph.Refresh();
}

В массиве Points хранятся данные для текущих параметров вероятности. Обработчик событий Click кнопки Go кнопки анализирует количество введенных событий и делает массив Points достаточно большим, чтобы удерживать вероятности событий. Затем код анализирует вероятность события и преобразует его в десятичное значение (как в 0,5 вместо 50%).

Далее код перебирает нужные события, вычисляя вероятности событий и сохраняя результаты в массиве Points. Для удобства рисования код сохраняет значение вероятности в процентах.

После вычисления всех вероятностей событий код обновляет picGraph PictureBox, чтобы отобразить результаты. Следующий код показывает, как обработчик событий picGraph управления Paint рисует график.

private void picGraph_Paint(object sender, PaintEventArgs e)
{
        e.Graphics.Clear(picGraph.BackColor);
    if (Points.Length < 2) return;
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

        RectangleF rect = new RectangleF(0, 0, Points.Length + 1, 100);
    PointF[] pts =
    {
        new PointF(0, picGraph.ClientSize.Height),
        new PointF(picGraph.ClientSize.Width,
                   picGraph.ClientSize.Height),
        new PointF(0, 0)
    };
    Matrix transform = new Matrix(rect, pts);

    using (Pen pen = new Pen(Color.Gray, 0))
    {
                using (StringFormat sf = new StringFormat())
        {
            sf.LineAlignment = StringAlignment.Center;
            for (int i = 0; i <= 100; i += 10)
            {
                                pts = new PointF[]
                {
                    new PointF(0, i),
                    new PointF(Points.Length, i),
                };
                transform.TransformPoints(pts);
                e.Graphics.DrawLine(pen, pts[0], pts[1]);
                e.Graphics.DrawString(i.ToString(), this.Font,
                    Brushes.Green, pts[0], sf);
            }

            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Far;
            int skip = (int)(Points.Length / 10);
            skip = 5 * (int)(skip / 5);
            if (skip < 1) skip = 1;
            for (int i = 0; i < Points.Length; i += skip)
            {
                                pts = new PointF[]
                {
                    new PointF(i, 0),
                    new PointF(i, 5),
                };
                transform.TransformPoints(pts);
                e.Graphics.DrawLine(pen, pts[0], pts[1]);
                e.Graphics.DrawString(i.ToString(), this.Font,
                    Brushes.Green, pts[0], sf);
            }
        }

                pen.Color = Color.Blue;
        e.Graphics.Transform = transform;
        e.Graphics.DrawLines(pen, Points);
    }
}

Этот код сначала очищает PictureBox. Тогда, если нет точек данных, они просто возвращаются.

Затем код создает матрицу преобразования для преобразования данных в соответствии с PictureBox. Для этого он создает RectangleF, представляющий глобальные координатные границы точек. Они колеблются от 0 до 100 в направлении Y (проценты) и 0 к числу событий в направлении X.

В коде также создается массив точек, указывающий, где на PictureBox должны отображаться верхние левые, верхние и нижние левые углы границ глобальной границы. Он использует RectangleF и массив точек для создания Matrix, который отображает из координат мира в координаты PictureBox.

Затем программа рисует график. Он создает тонкую ручку для рисования и создает объект StringFormat для использования при рисовании текста.

Далее код рисует горизонтальные линии для каждой множественной вероятности 10%. Он рисует линию, соединяющую точки (0, i) - (Points.Length, i) для i = 10, 20, 30 и т. д. Для этого код должен преобразовывать координаты точек, чтобы они соответствовали преобразованным точкам на графике. Он делает это, вызывая метод преобразования TransformPoints матрицы преобразования.

После того, как он рисует каждую горизонтальную линию, код также рисует текст, дающий вероятность линии. Он позиционирует текст в левой конечной точке линии (0, i) и центрируется по вертикали на линии.

Далее код рисует ось X. Он перебирает значения между 0 и числом событий, которые рисуют метки вертикального тика и номера событий.

После рисования осей и их меток рисование фактического графика прост. Код применяет матрицу преобразования к объекту Graphics и вызывает метод DrawLines объекта для рисования строк.

Источник: http://csharphelper.com/blog/2017/05/graph-event-probabilities-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector