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