Нарисуйте заполненную картиной гистограмму в 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.
