Нарисуйте заполненную картиной гистограмму в C#

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

Следующий метод TileRectangle заполняет прямоугольник изображением.

// Пометьте область из левого нижнего угла вверх.
private void TileRectangle(Graphics gr, RectangleF rect, Image picture)
{
    using (TextureBrush brush = new TextureBrush(picture))
    {
        // Переместите кисть, чтобы она начиналась с
        // Перебираем нижний левый угол.
        brush.(rect.Left, rect.Bottom);

        // Заполните.
        gr.FillRectangle(brush, rect);
    }
}

Этот код создает из изображения TextureBrush. Обычно, когда вы заполняете прямоугольник с помощью TextureBrush, кисть начинается с изображения в верхнем левом углу области. Гистограммы обычно начинаются с изображения в левом нижнем углу, поэтому этот метод использует метод TranslateTransform кисти, чтобы преобразовать начало кисти в нижний левый угол прямоугольника.

Затем метод заполняет прямоугольник кистью.

Следующий код вызывает метод TileRectangle.

// Нарисуем гистограмму.
private void DrawHistogram(Graphics gr, Color back_color,
    float[] values, int width, int height,
    float xscale, float yscale)
{
    gr.Clear(back_color);

    // Изображения, которые мы будем использовать для заполнения прямоугольников.
    Image[] images =
    {
        Properties.Resources.apple,
        Properties.Resources.banana,
        Properties.Resources.grapes,
        Properties.Resources.pear,
        Properties.Resources.strawberry,
        Properties.Resources.tomato,
    };

    // Рисуем гистограммы.
    for (int i = 0; i < values.Length; i++)
    {
        // Получаем границы прямоугольника в координатах устройства.
        float rect_wid = xscale;
        float rect_hgt = yscale * values[i];
        float rect_x = i * xscale;
        float rect_y = height - rect_hgt;

        // Создаем прямоугольник.
        RectangleF rect = new RectangleF(
            rect_x, rect_y, rect_wid, rect_hgt);

        // Заполните прямоугольник.
        TileRectangle(gr, rect, images[i]);

        // Очертите прямоугольник.
        gr.DrawRectangle(Pens.Black,
            rect_x, rect_y, rect_wid, rect_hgt);
    }
}

Этот метод очищает объект Graphics, а затем создает массив, содержащий изображения, которые он будет использовать. Я добавил изображения в программу во время разработки, выбрав «Проект»> «Свойства», щелкнув вкладку «Ресурсы», открыв раскрывающееся меню «Добавить ресурс» и выбрав «Добавить существующий файл».

Далее код проходит через значения гистограммы. Он масштабирует ширину и высоту каждого значения и использует результаты, чтобы сделать RectangleF для представления значения. Затем он вызывает TileRectangle, чтобы заполнить прямоугольник его изображением, а затем очерчивает прямоугольник.

Единственный оставшийся фрагмент интересного кода выглядит следующим образом.

// Нарисуем гистограмму.
private void picHisto_Paint(object sender, PaintEventArgs e)
{
    // Вычисление преобразования в карту
    // значения данных в PictureBox.
    float xscale = picHisto.ClientSize.Width / (float)DataValues.Length;
    float yscale = picHisto.ClientSize.Height / (float)(MAX_VALUE - MIN_VALUE);

    DrawHistogram(e.Graphics, picHisto.BackColor, DataValues,
        picHisto.ClientSize.Width, picHisto.ClientSize.Height,
        xscale, yscale);
}

Этот код вычисляет масштабные коэффициенты в направлениях X и Y для отображения диапазона допустимых значений на PictureBox.

Источник: http://csharphelper.com/blog/2017/09/draw-picture-filled-histogram-c/

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

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *